Pl2 INTERRUP.DOC/fr: Difference between revisions
Jump to navigation
Jump to search
Olivier.jan (talk | contribs) (Replacing content with updated version) |
Olivier.jan (talk | contribs) mNo edit summary |
||
Line 11: | Line 11: | ||
Avant de commencer à vous parler des programmes sous interruption, nous |
Avant de commencer à vous parler des programmes sous interruption, nous |
||
− | allons |
+ | allons étudier: |
*** LES VARIABLES SYSTEME *** |
*** LES VARIABLES SYSTEME *** |
||
Line 17: | Line 17: | ||
- Les VARIABLES SYSTEME sont diverses informations qui nous sont dispo- |
- Les VARIABLES SYSTEME sont diverses informations qui nous sont dispo- |
||
− | nibles en lecture et en |
+ | nibles en lecture et en écriture et qui se situent au début du second |
KO de la RAM de notre ST. (L'emplacement en RAM varie si vous possèdez |
KO de la RAM de notre ST. (L'emplacement en RAM varie si vous possèdez |
||
un MEGA ST au un ST dont le système d'exploitation (le TOS) n'est pas |
un MEGA ST au un ST dont le système d'exploitation (le TOS) n'est pas |
||
− | en ROM, mais il ne varie pas entre les |
+ | en ROM, mais il ne varie pas entre les différentes versions de ROM) |
- Pour atteindre ces variables, il faudra d'abord se positonner en MODE |
- Pour atteindre ces variables, il faudra d'abord se positonner en MODE |
||
Line 29: | Line 29: | ||
influences grandement le fonctionnement du ST: |
influences grandement le fonctionnement du ST: |
||
− | Voilà les adresses ou se situent ces |
+ | Voilà les adresses ou se situent ces différentes variables ainsi que |
− | leurs noms , leurs tailles et leurs |
+ | leurs noms , leurs tailles et leurs utilité: |
− | Les noms ci-dessous sont les noms standard |
+ | Les noms ci-dessous sont les noms standard donnés par ATARI à ces |
− | variables ,les adresses qui leur sont |
+ | variables ,les adresses qui leur sont attribuées sont uniquement |
valables pour les ST avec le TOS en RAM. |
valables pour les ST avec le TOS en RAM. |
||
Line 43: | Line 43: | ||
$FCA648 ( Je donne les adresses valables |
$FCA648 ( Je donne les adresses valables |
||
pour les ST avec TOS en ROM ) et qui per- |
pour les ST avec TOS en ROM ) et qui per- |
||
− | met l' |
+ | met l'exécution des fonctions périodiques |
du GEM. |
du GEM. |
||
. $404 evt_critic (.W) : C'est un vecteur qui pointe sur l'adresse |
. $404 evt_critic (.W) : C'est un vecteur qui pointe sur l'adresse |
||
− | $2A156 et qui est |
+ | $2A156 et qui est utilisé quand le système |
d'exploitation doit traiter une erreur pro |
d'exploitation doit traiter une erreur pro |
||
venant du lecteur de disquette. ( Lecteur |
venant du lecteur de disquette. ( Lecteur |
||
− | ne |
+ | ne répond pas... ) |
− | . $408 evt_term (.L) : C'est un vecteur qui est |
+ | . $408 evt_term (.L) : C'est un vecteur qui est utilisé par les |
fonctions de type _TERM du Gemdos qui ser- |
fonctions de type _TERM du Gemdos qui ser- |
||
− | vent à finir l' |
+ | vent à finir l'exécution d'un programme. |
− | . $40C evt_xtra 5*(.L) : 5 L-M y sont |
+ | . $40C evt_xtra 5*(.L) : 5 L-M y sont réservés pour des |
applications futures... |
applications futures... |
||
− | . $420 memvalid (.L) : |
+ | . $420 memvalid (.L) : Sémaphore pour une configuration de |
− | controleur de |
+ | controleur de mémoire valide. |
. $424 memctrl (.B) : Si memctrl=4 l'ordi est un 520 ST |
. $424 memctrl (.B) : Si memctrl=4 l'ordi est un 520 ST |
||
Line 68: | Line 68: | ||
. $426 resvalid (.L) : Si il vaut $31415926 (soit PI sans la vir- |
. $426 resvalid (.L) : Si il vaut $31415926 (soit PI sans la vir- |
||
− | gule) l'adresse |
+ | gule) l'adresse pointée par resvector sera |
− | + | utilisée comme vecteur lors d'un RESET. |
|
− | . $42A resvector (.L) : Le vecteur |
+ | . $42A resvector (.L) : Le vecteur utilisé par resvalid lors d'un |
RESET. |
RESET. |
||
− | . $42E phystop (.L) : Adresse de la fin de la |
+ | . $42E phystop (.L) : Adresse de la fin de la mémoire vidéo |
physique. |
physique. |
||
− | . $432 _membot (.L) : Adresse du |
+ | . $432 _membot (.L) : Adresse du début de la zone de la mémoire |
− | + | réservée pour le programmeur.(voir organi- |
|
− | sation de la |
+ | sation de la mémoire plus loin) |
. $436 _memtop (.L) : Adresse de la fin de cette zone ( $78000 |
. $436 _memtop (.L) : Adresse de la fin de cette zone ( $78000 |
||
Line 87: | Line 87: | ||
memvalid |
memvalid |
||
− | . $43E flock (.L) : Si flock est |
+ | . $43E flock (.L) : Si flock est différent de 0, la VBL est |
− | + | arrêtée (Voir plus loin pour VBL) |
|
− | . $440 seekrate (.W) : Permet de selectionner la vitesse de |
+ | . $440 seekrate (.W) : Permet de selectionner la vitesse de dé- |
placement de la tête de lecture du lecteur |
placement de la tête de lecture du lecteur |
||
de disquette d'une piste : |
de disquette d'une piste : |
||
0=6 ms,1=12 ms,2=2 ms,3=3 ms |
0=6 ms,1=12 ms,2=2 ms,3=3 ms |
||
− | . $442 _timer_ms (.W) : Temps |
+ | . $442 _timer_ms (.W) : Temps écoulé entre 2 appels du timer, soit |
la vitesse des battements de l'horloge in- |
la vitesse des battements de l'horloge in- |
||
terne. (en millisecondes) |
terne. (en millisecondes) |
||
Line 101: | Line 101: | ||
(Voir plus loin pour les TIMERS) |
(Voir plus loin pour les TIMERS) |
||
− | . $444 _fverify (.W) : Si _fverify est |
+ | . $444 _fverify (.W) : Si _fverify est différent de 0, il y a un |
− | test d' |
+ | test d'écriture qui est effectué par le |
− | lecteur de disquette:A chaque |
+ | lecteur de disquette:A chaque écriture, il |
− | relit l'octet |
+ | relit l'octet écris et le compare a l'oc- |
− | tet à |
+ | tet à écrire. |
En cas d'erreur, on obtient un code |
En cas d'erreur, on obtient un code |
||
d'erreur |
d'erreur |
||
− | . $446 _bootdev (.W) : Contient le |
+ | . $446 _bootdev (.W) : Contient le numéro du lecteur de disquette |
− | qui a |
+ | qui a chargé le système d'éxploitation. |
. $448 palmode (.W) : Drapeau qui indique soit que le système se |
. $448 palmode (.W) : Drapeau qui indique soit que le système se |
||
− | trouve en mode |
+ | trouve en mode vidéo 50 Hz (PAL) si palmo- |
− | de est |
+ | de est différent de 0 soit qu'on est en |
− | mode |
+ | mode vidéo 60 Hz (Standard NTSC) |
− | . $44A defshiftmd (.W) : Contient la |
+ | . $44A defshiftmd (.W) : Contient la résolution de l'écran dans la- |
− | quelle on se trouve si on passe d'un |
+ | quelle on se trouve si on passe d'un écran |
− | Haute |
+ | Haute résolution à un écran Couleur. |
(0=basse,1=moyenne) |
(0=basse,1=moyenne) |
||
− | . $44C sshiftmd (.W) : Contient la |
+ | . $44C sshiftmd (.W) : Contient la résolution de l'écran dans la- |
quelle on se trouve:0=BASSE,1=MOYENNE, |
quelle on se trouve:0=BASSE,1=MOYENNE, |
||
2=HAUTE |
2=HAUTE |
||
− | . $44E _v_bas_ad (.L) : Contient l'adresse du |
+ | . $44E _v_bas_ad (.L) : Contient l'adresse du début de la mémoire |
− | + | vidéo logique.C'est obligatoirement un |
|
multiple de 256 |
multiple de 256 |
||
. $452 vblsem (.W) : Si cette valeur est nulle, la VBL n'est |
. $452 vblsem (.W) : Si cette valeur est nulle, la VBL n'est |
||
− | plus |
+ | plus exécutée:Voir plus loin pour la VBL |
− | . $454 nvbls (.W) : Contient le nombre de routines |
+ | . $454 nvbls (.W) : Contient le nombre de routines exécutées |
lors du VBL (Logiquement 8) |
lors du VBL (Logiquement 8) |
||
. $456 _vblqueue (.L) : Vecteur qui pointe sur les adresses des |
. $456 _vblqueue (.L) : Vecteur qui pointe sur les adresses des |
||
− | routines |
+ | routines exécutées lors du VBL |
− | . $45A colorptr (.L) : Si ce L-M est |
+ | . $45A colorptr (.L) : Si ce L-M est différent de 0,il est inter- |
− | + | prété comme l'adresse d'une nouvelle |
|
palette de couleurs. |
palette de couleurs. |
||
− | . $45E screenpt (.L) : Si ce L-M n'est pas nul, il sera |
+ | . $45E screenpt (.L) : Si ce L-M n'est pas nul, il sera interpré- |
− | + | té comme l'adresse de la nouvelle mémoire |
|
− | + | vidéo physique. |
|
. $462 _vbclock (.L) : C'est le compteur d'interruptions de la |
. $462 _vbclock (.L) : C'est le compteur d'interruptions de la |
||
Line 151: | Line 151: | ||
. $466 _frclock (.L) : Contient le nombre de routines VBL qui ne |
. $466 _frclock (.L) : Contient le nombre de routines VBL qui ne |
||
− | sont pas |
+ | sont pas bloquées par vblsem. |
Ce nombre sert aussi à la fonction RANDOM |
Ce nombre sert aussi à la fonction RANDOM |
||
− | de l'XBIOS pour obtenir un nombre |
+ | de l'XBIOS pour obtenir un nombre aléatoi- |
re. |
re. |
||
Line 159: | Line 159: | ||
tialisation du disque dur en $FC0D60 |
tialisation du disque dur en $FC0D60 |
||
− | . $46E swv_vec (.L) : Vecteur qui pointe sur la routine |
+ | . $46E swv_vec (.L) : Vecteur qui pointe sur la routine exécutée |
− | lorsqu'on |
+ | lorsqu'on déconnecte ou connecte un moni- |
teur monochrome (en $FC0020). |
teur monochrome (en $FC0020). |
||
Line 166: | Line 166: | ||
(Getbpb) |
(Getbpb) |
||
− | . $476 hdv_rw (.L) : Vecteur qui pointe sur les routines d' |
+ | . $476 hdv_rw (.L) : Vecteur qui pointe sur les routines d'écr- |
− | iture et de lecture de |
+ | iture et de lecture de données sur disque |
dur. |
dur. |
||
Line 177: | Line 177: | ||
voir MEDIACH de code $4 dans le BIOS) |
voir MEDIACH de code $4 dans le BIOS) |
||
− | . $482 _cmdload (.W) : Si cette variable est |
+ | . $482 _cmdload (.W) : Si cette variable est différente de 0, le |
− | programme |
+ | programme nommé 'COMMAND.PRG' sera chargé |
dès que le système d'exploitation est mis |
dès que le système d'exploitation est mis |
||
en place.Cette variable devra ètre modifi- |
en place.Cette variable devra ètre modifi- |
||
− | + | ée sur le BOOT SECTOR. |
|
. $484 conterm (.B) : C'est un vecteur bit dont les 4 premiers |
. $484 conterm (.B) : C'est un vecteur bit dont les 4 premiers |
||
− | bits sont |
+ | bits sont utilisés.Si un de ces bits est |
− | actif,la fonction est |
+ | actif,la fonction est utilsée, sinon elle |
− | est |
+ | est déconnectée. |
− | Bit nr° 0 :BIP à chaque touche |
+ | Bit nr° 0 :BIP à chaque touche enfoncée |
− | Bit nr° 1 : |
+ | Bit nr° 1 :Répétition au clavier |
Bit nr° 2 :Control+G donne un BIP |
Bit nr° 2 :Control+G donne un BIP |
||
Bit nr° 3 :Permet de règler la fonction |
Bit nr° 3 :Permet de règler la fonction |
||
BCONIN du BIOS. |
BCONIN du BIOS. |
||
− | . $492 themd2 (.L) : Adresse du |
+ | . $492 themd2 (.L) : Adresse du début de la mémoire disponible |
− | . $496 themd3 (.L) : Adresse de la fin de la |
+ | . $496 themd3 (.L) : Adresse de la fin de la mémoire disponible |
. $4A2 savptr (.L) : Adresse ($90C) qui pointe une zone de la |
. $4A2 savptr (.L) : Adresse ($90C) qui pointe une zone de la |
||
− | + | mémoire utilisée pour la sauvegarde des |
|
registres par le PROCESSEUR après un appel |
registres par le PROCESSEUR après un appel |
||
à une fonction BIOS ou XBIOS |
à une fonction BIOS ou XBIOS |
||
. $4A6 _nflops (.W) : Contient le nombre de lecteurs de |
. $4A6 _nflops (.W) : Contient le nombre de lecteurs de |
||
− | disquette |
+ | disquette connectés. |
. $4A8 con_state (.L) : Vecteur pointant sur les routines de code |
. $4A8 con_state (.L) : Vecteur pointant sur les routines de code |
||
('ESC' + 'valeur') pour les effets des |
('ESC' + 'valeur') pour les effets des |
||
− | + | éditions graphiques de texte. |
|
− | . $4AC save_row (.W) : |
+ | . $4AC save_row (.W) : Mémoire temporaire de la position du cur- |
seur du texte pour la fonction ESC+'Y' |
seur du texte pour la fonction ESC+'Y' |
||
− | . $4AE sav_context (.L) : Adresse pointant sur une |
+ | . $4AE sav_context (.L) : Adresse pointant sur une mémoire tempo- |
− | raire |
+ | raire utilisée en cas de traitement d'une |
− | + | procédure d'exeption. |
|
− | . $4BA _hz_200 (.L) : Le timer du système qui est |
+ | . $4BA _hz_200 (.L) : Le timer du système qui est incrémenté |
200 fois par seconde. |
200 fois par seconde. |
||
− | . $4BC _the_env (.L) : La chaine de caractère prise par |
+ | . $4BC _the_env (.L) : La chaine de caractère prise par défaut , |
− | + | positionnée sur 4 octets nuls... |
|
− | . $4C2 _drvbits (.L) : Vecteur bit |
+ | . $4C2 _drvbits (.L) : Vecteur bit représentant suivant le nr° du |
− | bits actif le ou les drives |
+ | bits actif le ou les drives connectés. |
− | . $4C6 _dskbufp (.L) : Tampon de 1 KO |
+ | . $4C6 _dskbufp (.L) : Tampon de 1 KO utilisé par les opérations |
de disk. |
de disk. |
||
. $4CE _vbl_list 8*(.L) : Vecteur qui pointe sur les adresses des 8 |
. $4CE _vbl_list 8*(.L) : Vecteur qui pointe sur les adresses des 8 |
||
− | routines qui sont |
+ | routines qui sont exécutées dans la VBL. |
− | . $4EE _dumpflg 8*(.L) : |
+ | . $4EE _dumpflg 8*(.L) : Sémaphore utilisée par la fonction de |
− | Hardcopy |
+ | Hardcopy activée par l'appui de Alternate |
et Help. |
et Help. |
||
− | . $4F2 _sysbase (.L) : Adresse du |
+ | . $4F2 _sysbase (.L) : Adresse du début du système d'exploitation |
($FC0000 sur les ST avec TOS en ROM) |
($FC0000 sur les ST avec TOS en ROM) |
||
Line 241: | Line 241: | ||
tion ($A100 sur les ST avec TOS en ROM) |
tion ($A100 sur les ST avec TOS en ROM) |
||
− | . $4FE exec_os (.L) : Adresse du |
+ | . $4FE exec_os (.L) : Adresse du début de l'AES ($FD91D0) |
. $502 dump_vec (.L) : Vecteur qui pointe sur la routine de |
. $502 dump_vec (.L) : Vecteur qui pointe sur la routine de |
||
hardcopy de la fonction 20 du XBIOS. |
hardcopy de la fonction 20 du XBIOS. |
||
− | . $506 prt_stat (.L) : |
+ | . $506 prt_stat (.L) : Sémaphore pour l'état de l'imprimante |
− | . $50A prt_vec (.L) : Vecteur pour les fonctions d' |
+ | . $50A prt_vec (.L) : Vecteur pour les fonctions d'édition sur |
imprimante |
imprimante |
||
− | . $50E aux_sta (.L) : Vecteur de recherche d' |
+ | . $50E aux_sta (.L) : Vecteur de recherche d'état utilisé par |
une fonction de Hardcopy |
une fonction de Hardcopy |
||
− | . $512 aux_vec (.L) : Vecteur de sortie |
+ | . $512 aux_vec (.L) : Vecteur de sortie utilisé par une fonction |
de Hardcopy |
de Hardcopy |
||
Voilà la liste de ces variables systèmes, pour les modifier, il suffira |
Voilà la liste de ces variables systèmes, pour les modifier, il suffira |
||
− | donc de se mettre en MODE SUPERVISEUR et d'y |
+ | donc de se mettre en MODE SUPERVISEUR et d'y déposer la valeur que vous |
− | voulez...(Vous pouvez bien sur aussi vous contenter de lire les |
+ | voulez...(Vous pouvez bien sur aussi vous contenter de lire les données |
− | qui y sont |
+ | qui y sont déposées...) |
− | Ainsi, si vous voulez connaitre la |
+ | Ainsi, si vous voulez connaitre la résolution: |
− | Vous |
+ | Vous écrirez: |
* ;LECTURE d'une VARIABLE SYSTEME: |
* ;LECTURE d'une VARIABLE SYSTEME: |
||
Line 272: | Line 272: | ||
move.w $44C,d0 ;$44C=sshiftmd |
move.w $44C,d0 ;$44C=sshiftmd |
||
− | et Vous obtenez la |
+ | et Vous obtenez la résolution de l'écran dans d0.W !!! |
− | Si vous voulez changer la palette des couleurs, vous |
+ | Si vous voulez changer la palette des couleurs, vous écrirez: |
* ;ECRITURE sur une VARIABLE SYSTEME: |
* ;ECRITURE sur une VARIABLE SYSTEME: |
||
Line 290: | Line 290: | ||
− | Cette |
+ | Cette méthode s'applique à toutes les variables système... |
− | Ces variables |
+ | Ces variables présentent un très grand intérêt pour nous car grƒce |
à elles, il n'est plus utile d'appeller certaines fonctions du BIOS, |
à elles, il n'est plus utile d'appeller certaines fonctions du BIOS, |
||
de l'XBIOS ou du GEMDOS pour obtenir des effets graphiques de base |
de l'XBIOS ou du GEMDOS pour obtenir des effets graphiques de base |
||
− | comme le changement de la palette,obtenir la |
+ | comme le changement de la palette,obtenir la résolution... : |
Voilà qui nous sera vraiment très utile car ces variables systèmes se |
Voilà qui nous sera vraiment très utile car ces variables systèmes se |
||
− | laissent très facilement modifier ou lire.Mais le plus grand |
+ | laissent très facilement modifier ou lire.Mais le plus grand intérêt |
− | qu'on peut en tirer,c'est que modifer une variable système ne |
+ | qu'on peut en tirer,c'est que modifer une variable système ne nécessi- |
te pas l'utilisation de registres (SP ou des valeurs en RETOUR) ,con- |
te pas l'utilisation de registres (SP ou des valeurs en RETOUR) ,con- |
||
trairement aux fonction de BIOS,XBIOS ou GEMDOS... |
trairement aux fonction de BIOS,XBIOS ou GEMDOS... |
||
Line 310: | Line 310: | ||
---------------------------------------- |
---------------------------------------- |
||
− | - Un programme sous interruption est un programme qui doit ètre |
+ | - Un programme sous interruption est un programme qui doit ètre exécuté |
− | + | périodiquement, à intervals réguliers. |
|
Un tel programme sera source d'un TRAITEMENT D'EXCEPTION: |
Un tel programme sera source d'un TRAITEMENT D'EXCEPTION: |
||
− | Il sera |
+ | Il sera exécuté si une certaine condition est vérifiée ( En pratique: |
− | après l' |
+ | après l'écoulement d'un certain temps de latence ) et sera interrompu |
− | ( Dès la rencontre d'instructions |
+ | ( Dès la rencontre d'instructions prévues à cet effet ) pour n'être à |
− | nouveau |
+ | nouveau appelé que lorsque la condition se retrouvera réalisée. |
Un programme sous-interruption n'arrète aucune fonction de l'ordi.: |
Un programme sous-interruption n'arrète aucune fonction de l'ordi.: |
||
− | Il est entièrement |
+ | Il est entièrement gèré à part. |
Il est tout à fait possible que votre programme principal effectue |
Il est tout à fait possible que votre programme principal effectue |
||
une boucle et qu'EN MEME TEMPS, un programme sous interruption s'e- |
une boucle et qu'EN MEME TEMPS, un programme sous interruption s'e- |
||
− | + | xécute sans interrompre le programme principal !! |
|
− | C'est d'ailleurs cette |
+ | C'est d'ailleurs cette propriété qui rend les programmes sous inter- |
ruption si utiles... |
ruption si utiles... |
||
(Pour ne pas dire indispensable, car il existe toujours des routines |
(Pour ne pas dire indispensable, car il existe toujours des routines |
||
− | sous interruption qui sont |
+ | sous interruption qui sont activées en permanence pour des raisons |
vitales ...) |
vitales ...) |
||
− | Nous |
+ | Nous étudierons tout cela en détail très bientot, pas de panique ! |
− | - Il existe des ROUTINES D'EXCEPTION qui sont |
+ | - Il existe des ROUTINES D'EXCEPTION qui sont exécutées par le système |
− | d'exploitation si une certaine condition ( |
+ | d'exploitation si une certaine condition (spécifique) est vérifiée. |
− | Ce sont des programmes |
+ | Ce sont des programmes exécutés exeptionnelement (d'o— leur nom !), |
− | c.à.d. si la condition qui les actives se trouve |
+ | c.à.d. si la condition qui les actives se trouve réalisée. |
− | Ces programmes d'exception sont |
+ | Ces programmes d'exception sont pointés par une suite de VECTEURS qui |
− | se situent dans le premier KO de la |
+ | se situent dans le premier KO de la mémoire et qui pointent l'adresse |
− | de la ROUTINE D'EXCEPTION |
+ | de la ROUTINE D'EXCEPTION conscernée. |
Ils sont responsables d'un certain nombre de fonctions vitales de |
Ils sont responsables d'un certain nombre de fonctions vitales de |
||
notre MICROPROCESSEUR. |
notre MICROPROCESSEUR. |
||
Line 347: | Line 347: | ||
En pratique: |
En pratique: |
||
− | Vous avez surement |
+ | Vous avez surement déjà vu un certain nombre de BOMBES s'afficher à |
− | l' |
+ | l'écran quand vous avez créé un programme qui ne marchait pas corr- |
ectement.Ces bombes servent à identifier la source de l'erreur pour |
ectement.Ces bombes servent à identifier la source de l'erreur pour |
||
le programmeur (ou l'utilisateur) et proviennent d'un traitement |
le programmeur (ou l'utilisateur) et proviennent d'un traitement |
||
d'exception. |
d'exception. |
||
Il existe 255 VECTEURS D'EXCEPTION et le nombre de bombes qui |
Il existe 255 VECTEURS D'EXCEPTION et le nombre de bombes qui |
||
− | s'affichent vous renseigne sur le nr° de l'exception qui a |
+ | s'affichent vous renseigne sur le nr° de l'exception qui a été |
− | + | solicité. |
|
− | Voilà les |
+ | Voilà les différents VECTEURS D'EXECPTION ainsi que leurs emplacements |
− | en |
+ | en mémoire. |
Ce sont des L-M car ce sont des ADRESSES qui pointent sur des routines |
Ce sont des L-M car ce sont des ADRESSES qui pointent sur des routines |
||
− | + | spécifiques au VECTEUR conscerné. |
|
Line 371: | Line 371: | ||
3 : $00C :ERREUR d'ADRESSE (3 BOMBES) |
3 : $00C :ERREUR d'ADRESSE (3 BOMBES) |
||
4 : $010 :INTRUCTION ILLEGALE (4 BOMBES) |
4 : $010 :INTRUCTION ILLEGALE (4 BOMBES) |
||
− | 5 : $014 :ERREUR car une DIVISION par ZERO a |
+ | 5 : $014 :ERREUR car une DIVISION par ZERO a été |
− | + | détectée. |
|
(La routine n'est en fait qu'un RTE !) |
(La routine n'est en fait qu'un RTE !) |
||
− | 6 : $018 : |
+ | 6 : $018 :Utilisé par CHK |
− | 7 : $01C : |
+ | 7 : $01C :Utilisé par TRAPV |
− | 8 : $020 :VIOLATION DE PRIVILEGE:On a |
+ | 8 : $020 :VIOLATION DE PRIVILEGE:On a essayé de |
− | toucher à des |
+ | toucher à des données uniquement acc- |
− | + | ésibles en MODE SUPERVISEUR |
|
− | 9 : $024 :Adresse de la routine |
+ | 9 : $024 :Adresse de la routine exécutée après |
chaque instruction en mode TRACE |
chaque instruction en mode TRACE |
||
− | 10 : $028 :ERREUR d' |
+ | 10 : $028 :ERREUR d'émulation de LINEA |
− | 11 : $02C :ERREUR d' |
+ | 11 : $02C :ERREUR d'émulation de LINEF |
− | 12 à 14 : $030 : |
+ | 12 à 14 : $030 :Réservé pour des applications futures |
15 : $03C :INTERRUPTION NON INITIALISEE |
15 : $03C :INTERRUPTION NON INITIALISEE |
||
− | 16 à 23 : $040 : |
+ | 16 à 23 : $040 :Réservé pour des applications futures |
24 : $060 :INTERRUPTION secondaire |
24 : $060 :INTERRUPTION secondaire |
||
25 : $064 :IPL 1 |
25 : $064 :IPL 1 |
||
Line 394: | Line 394: | ||
30 : $078 :IPL 6 |
30 : $078 :IPL 6 |
||
31 : $07C :IPL 7 |
31 : $07C :IPL 7 |
||
− | 32 : $080 : |
+ | 32 : $080 :Utilisé par TRAP #0 |
− | 33 : $084 : |
+ | 33 : $084 :Utilisé par TRAP #1 (GEMDOS) |
− | 34 : $088 : |
+ | 34 : $088 :Utilisé par TRAP #2 (AES/VDI) |
− | 35 : $08C : |
+ | 35 : $08C :Utilisé par TRAP #3 |
− | 36 : $090 : |
+ | 36 : $090 :Utilisé par TRAP #4 |
− | 37 : $094 : |
+ | 37 : $094 :Utilisé par TRAP #5 |
− | 38 : $098 : |
+ | 38 : $098 :Utilisé par TRAP #6 |
− | 39 : $09C : |
+ | 39 : $09C :Utilisé par TRAP #7 |
− | 40 : $0A0 : |
+ | 40 : $0A0 :Utilisé par TRAP #8 |
− | 41 : $0A4 : |
+ | 41 : $0A4 :Utilisé par TRAP #9 |
− | 42 : $0A8 : |
+ | 42 : $0A8 :Utilisé par TRAP #10 |
− | 43 : $0AC : |
+ | 43 : $0AC :Utilisé par TRAP #11 |
− | 44 : $0B0 : |
+ | 44 : $0B0 :Utilisé par TRAP #12 |
− | 45 : $0B4 : |
+ | 45 : $0B4 :Utilisé par TRAP #13 (BIOS) |
− | 46 : $0B8 : |
+ | 46 : $0B8 :Utilisé par TRAP #14 (XBIOS) |
− | 47 : $0BC : |
+ | 47 : $0BC :Utilisé par TRAP #15 |
− | 48 à 63 : $0C0 : |
+ | 48 à 63 : $0C0 :Réservé |
64 à 255 : $100 :disponibles à l'utilisateur, on y |
64 à 255 : $100 :disponibles à l'utilisateur, on y |
||
trouve notament: |
trouve notament: |
||
Line 419: | Line 419: | ||
− | Le |
+ | Le détail viendra plus loin. |
En pratique, si votre programme affiche 3 BOMBES avant de rendre l'ƒme, |
En pratique, si votre programme affiche 3 BOMBES avant de rendre l'ƒme, |
||
− | c'est qu'une erreur d'adresse a |
+ | c'est qu'une erreur d'adresse a été détectée, si il en affiche 4,c'est |
− | qu'une instruction |
+ | qu'une instruction illégale a été détectée... |
− | Voilà maintenant comment l'ordi. s'y prend pour |
+ | Voilà maintenant comment l'ordi. s'y prend pour exécuter une ROUTINE |
d'EXEPTION: |
d'EXEPTION: |
||
Line 436: | Line 436: | ||
.Chargement dans le PC de l'adresse que contient le VECTEUR d'EXCEPTION |
.Chargement dans le PC de l'adresse que contient le VECTEUR d'EXCEPTION |
||
choisi :Saut à la routine correspondante... |
choisi :Saut à la routine correspondante... |
||
− | . |
+ | .Exécution du programme d'exCeption et retour dès la rencontre d'un |
RTE (Return From Exception) |
RTE (Return From Exception) |
||
.Restauration des registres SR et PC. |
.Restauration des registres SR et PC. |
||
Il est tout à fait possible de modifier ces vecteurs, il suffit de |
Il est tout à fait possible de modifier ces vecteurs, il suffit de |
||
− | + | dépose l'adresse (L-M) de la nouvelle routine à exécuter à l'adresse |
|
du vecteur à modifer. (MOVE.L #NEW,$vecteur) |
du vecteur à modifer. (MOVE.L #NEW,$vecteur) |
||
− | Ceci aurra pour effet de |
+ | Ceci aurra pour effet de détourner l'exécution de la ROUTINE D'EXCEP- |
TION vers votre propre routine... |
TION vers votre propre routine... |
||
− | Nous verrons cela en |
+ | Nous verrons cela en détail quand je parlerais du mode TRACE. |
Line 453: | Line 453: | ||
,il faudra attribuer un NIVEAU DE PRIORITE à notre programme sous inter- |
,il faudra attribuer un NIVEAU DE PRIORITE à notre programme sous inter- |
||
ruption. |
ruption. |
||
− | Plus ce NIVEAU DE PRIORITE sera |
+ | Plus ce NIVEAU DE PRIORITE sera élevé, et plus grande sera l'importance |
− | + | accordée à notre programme dans la hiérarchie. |
|
− | Le NIVEAU DE PRIORITE de notre programme sera |
+ | Le NIVEAU DE PRIORITE de notre programme sera définit par l'état des |
BITS I1,I2,I3 du REGISTRE D'ETAT 'SR' (Disponible UNIQUEMENT en MODE |
BITS I1,I2,I3 du REGISTRE D'ETAT 'SR' (Disponible UNIQUEMENT en MODE |
||
SUPERVISEUR !!) |
SUPERVISEUR !!) |
||
− | Ces 3 BITS permettent de |
+ | Ces 3 BITS permettent de définir 8 niveaux de priorité. |
BITS I1 I2 I0 = % NIVEAU (ou Interrupt Priority Level) |
BITS I1 I2 I0 = % NIVEAU (ou Interrupt Priority Level) |
||
Line 477: | Line 477: | ||
:'IPL') 0 sera donc interrompu par tout autre programme d'IPL ò 1,un |
:'IPL') 0 sera donc interrompu par tout autre programme d'IPL ò 1,un |
||
programme d'IPL 1 ne sera interrompu que par un programme d'IPL ò 2 |
programme d'IPL 1 ne sera interrompu que par un programme d'IPL ò 2 |
||
− | mais restera |
+ | mais restera indifférent à un programme sous interruption d'IPL 0,et |
− | celui-ci ne sera donc pas |
+ | celui-ci ne sera donc pas exécuté car son IPL est < 1 etc... |
− | Le NIVEAU 0 est |
+ | Le NIVEAU 0 est théoriquement celui de votre programme. |
(Niveau le plus bas) |
(Niveau le plus bas) |
||
− | Le NIVEAU 7 est |
+ | Le NIVEAU 7 est théoriquement le niveau d'IPL qui permettra au prg |
− | sous interruption qui en est |
+ | sous interruption qui en est affecté qu'aucun autre programme sous |
interruption ne puisse l'interrompre. |
interruption ne puisse l'interrompre. |
||
− | (Il pourrait par exemple s'agir du RESET,qui a une |
+ | (Il pourrait par exemple s'agir du RESET,qui a une priorité ABSOLUE) |
− | . En pratique, seuls les niveaux 2,4 et 6 sont |
+ | . En pratique, seuls les niveaux 2,4 et 6 sont utilisés. |
− | l'IPL 2 est |
+ | l'IPL 2 est utilisé par le HBL |
− | l'IPL 4 est |
+ | l'IPL 4 est utilisé par les routines du VBL |
− | l'IPL 6 est |
+ | l'IPL 6 est utilisé par les interruptions du MFP 68901 |
le HBL: Horizontal BLank |
le HBL: Horizontal BLank |
||
------- |
------- |
||
− | Il s'agit en |
+ | Il s'agit en réalité d'une routine exécutée après que le SHIFTER |
− | affiche 1 ligne horizontale sur l' |
+ | affiche 1 ligne horizontale sur l'écran. |
− | Suivant le type de moniteur |
+ | Suivant le type de moniteur connecté, la routine est appellée toutes |
les 50 microsecondes (50Hz) ou toutes le 64 microsecondes (64 Hz) |
les 50 microsecondes (50Hz) ou toutes le 64 microsecondes (64 Hz) |
||
− | Un moniteur couleur possède 200 lignes horizontales, l' |
+ | Un moniteur couleur possède 200 lignes horizontales, l'écran est 'ra- |
fraichit' 50 fois par secondes (50 Hz), la routine de l'HBL est donc |
fraichit' 50 fois par secondes (50 Hz), la routine de l'HBL est donc |
||
− | + | appelé 10000 fois par seconde dans certaines conditions ! |
|
− | Cette routine ralentirait |
+ | Cette routine ralentirait énormément l'ordi. ,c'est pourquoi la routine |
− | de l'HBL n'est pas |
+ | de l'HBL n'est pas exécutée. (heuresement pour nous !) |
En effet, dès son premier appel,la routine positionnera automatiquement |
En effet, dès son premier appel,la routine positionnera automatiquement |
||
l'IPL de notre programme sur un niveau d'IPL 3: la routine ne sera donc |
l'IPL de notre programme sur un niveau d'IPL 3: la routine ne sera donc |
||
− | plus |
+ | plus appellée car elle a un niveau d'IPL 2... |
− | NB: Il est possible de |
+ | NB: Il est possible de détourner cette routine: |
-- |
-- |
||
− | Il suffit de |
+ | Il suffit de déposer l'adresse de votre routine dans le 26°ème |
VECTEUR d'EXCEPTION qui pointe sur la routine de l'HBL (.L) et |
VECTEUR d'EXCEPTION qui pointe sur la routine de l'HBL (.L) et |
||
de remettre l'IPL du programme à un niveau < 2 ( En modifiant |
de remettre l'IPL du programme à un niveau < 2 ( En modifiant |
||
− | les bits I1,I2,I3 du registre d' |
+ | les bits I1,I2,I3 du registre d'état ) |
Votre routine devra aussi se terminer par l'instruction RTE |
Votre routine devra aussi se terminer par l'instruction RTE |
||
(Return From Exception), mais nous en reparlerons bientot... |
(Return From Exception), mais nous en reparlerons bientot... |
||
Line 524: | Line 524: | ||
Elles ont un niveau d'interruption 4, elles sont donc prioritaires |
Elles ont un niveau d'interruption 4, elles sont donc prioritaires |
||
vis-à-vis de l'interrution de l'HBL. |
vis-à-vis de l'interrution de l'HBL. |
||
− | Ces routines sont |
+ | Ces routines sont exécutées après qu'un écran graphique ( 200 ou 400 |
− | lignes horizontales suivant la |
+ | lignes horizontales suivant la résolution) ait été édité en entier sur |
le moniteur. |
le moniteur. |
||
− | Elles s' |
+ | Elles s'exécutent donc 50 fois par seconde (50 Hz). |
Les routines de la VBL s'occuppent du changement de la palette des |
Les routines de la VBL s'occuppent du changement de la palette des |
||
− | couleurs ( Uniquement après qu'une image a |
+ | couleurs ( Uniquement après qu'une image a été dessinée en entier |
− | pour |
+ | pour éviter de perturber l'image ),elles testent le changement de |
disquette ... |
disquette ... |
||
Il y a en tout 8 routines, le nombre de routines disponibles est |
Il y a en tout 8 routines, le nombre de routines disponibles est |
||
contenu dans la variable système NVBLS et il existe un vecteur |
contenu dans la variable système NVBLS et il existe un vecteur |
||
qui pointe sur les 8 adresses de ces routines, en VBLQUEUE. |
qui pointe sur les 8 adresses de ces routines, en VBLQUEUE. |
||
− | En |
+ | En réalité, seule 1 routine est exécutée : Les 7 autres nous sont |
donc disponibles... |
donc disponibles... |
||
Line 542: | Line 542: | ||
Les interruptions du MFP 68901 (Multi Fonction Peripheral) |
Les interruptions du MFP 68901 (Multi Fonction Peripheral) |
||
------------------------------ |
------------------------------ |
||
− | Le MFP 68901 |
+ | Le MFP 68901 gére 16 interruptions,elles ont un niveau de priorité 6, |
elles sont donc prioritaires vis-à-vis des interruptions VBL et HBL. |
elles sont donc prioritaires vis-à-vis des interruptions VBL et HBL. |
||
− | Les 16 interruptions du MFP 68901 ont aussi des niveaux de |
+ | Les 16 interruptions du MFP 68901 ont aussi des niveaux de priorité |
− | + | différent entre elles ! |
|
Ainsi, une interruption du MFP de niveau 6 ne pourra que ètre inter- |
Ainsi, une interruption du MFP de niveau 6 ne pourra que ètre inter- |
||
rompue par une autre interruption de niveau > 6 etc... |
rompue par une autre interruption de niveau > 6 etc... |
||
− | Voilà les |
+ | Voilà les différentes interruptions du MFP 68901 , classées par |
− | niveau de |
+ | niveau de priorité (noté x sur l'ILP 6 du MFP ). |
NIVEAU (x/6) : L'interruption |
NIVEAU (x/6) : L'interruption |
||
− | 15/6 : |
+ | 15/6 : Détecteur de branchement ou de débranchement du moniteur |
− | haute |
+ | haute résolution |
14/6 : Ring indicator de l'interface RS232 |
14/6 : Ring indicator de l'interface RS232 |
||
13/6 : TIMER A de l'horloge interne |
13/6 : TIMER A de l'horloge interne |
||
− | 12/6 : Tampon de |
+ | 12/6 : Tampon de réception d'1 caractère à parir de la RS232 |
− | + | destiné à l'utilisateur |
|
− | 11/6 : Erreur de |
+ | 11/6 : Erreur de réception d'1 caractère provenant de |
l'interface RS232 |
l'interface RS232 |
||
− | 10/6 : Tampon temporaire d' |
+ | 10/6 : Tampon temporaire d'émission d'1 caractère à destination |
de la RS232 |
de la RS232 |
||
− | 9/6 : Erreur d' |
+ | 9/6 : Erreur d'émission d'1 caractère provenant de la RS232 |
8/6 : TIMER B et Compteur de retour à la ligne |
8/6 : TIMER B et Compteur de retour à la ligne |
||
7/6 : Routine de controle des lecteurs de disquette et du DMA |
7/6 : Routine de controle des lecteurs de disquette et du DMA |
||
6/6 : Routines de controle du clavier (ACIAs) et de la prise |
6/6 : Routines de controle du clavier (ACIAs) et de la prise |
||
− | MIDI (En |
+ | MIDI (En entrée et sortie) |
− | 5/6 : TIMER C |
+ | 5/6 : TIMER C utilisé par le YM-2149 (Son) ,le clavier et le |
compteur de synchronisation du système (à 200 Hz) |
compteur de synchronisation du système (à 200 Hz) |
||
− | 4/6 : TIMER D |
+ | 4/6 : TIMER D utilisé pour les opérations d'émission et de |
− | + | réception de la RS232 |
|
− | 3/6 : |
+ | 3/6 : Inutilisé |
2/6 : Routine de controle du CTS de la RS232 |
2/6 : Routine de controle du CTS de la RS232 |
||
1/6 : Routine de controle du DCD de la RS232 |
1/6 : Routine de controle du DCD de la RS232 |
||
− | 0/6 : |
+ | 0/6 : Utilisé par le BUSY de l'interface CENTRONICS pour créer |
un spooler d'imprimante. |
un spooler d'imprimante. |
||
− | Les termes ci dessus ne seront pas |
+ | Les termes ci dessus ne seront pas expliqués, vous n'aurez pas à vous |
en servir de toute manière, alors pourquoi compliquer ce qui n'est pas |
en servir de toute manière, alors pourquoi compliquer ce qui n'est pas |
||
− | + | déjà si simple ? |
|
− | Nous allons tout de mème |
+ | Nous allons tout de mème détailler et expliquer les modes de fonction- |
nement des TIMERS, car c'est leur programmation qui va nous permettre |
nement des TIMERS, car c'est leur programmation qui va nous permettre |
||
− | de |
+ | de réaliser nos programmes sous interruption. |
Les TIMERS: |
Les TIMERS: |
||
Line 596: | Line 596: | ||
. Le TIMER A est entièremet disponible au programmeur et a un niveau |
. Le TIMER A est entièremet disponible au programmeur et a un niveau |
||
− | de |
+ | de priorité 13 au sein du MFP (élevé!) |
− | . Le TIMER B est |
+ | . Le TIMER B est utilisé comme compteur de retour à la ligne mais vous |
− | pourrez très facilement le |
+ | pourrez très facilement le détourner.Il a un niveau de priorité 8 au |
sein du MFP ( IPL < à l'IPL du TIMER A) |
sein du MFP ( IPL < à l'IPL du TIMER A) |
||
. Les TIMERs C et D sont responsables d'un certain nombre de fonctions |
. Les TIMERs C et D sont responsables d'un certain nombre de fonctions |
||
− | importantes (gestion du son,du clavier ...), les |
+ | importantes (gestion du son,du clavier ...), les détourner peut donc |
poser beaucoup de problèmes... |
poser beaucoup de problèmes... |
||
− | De plus, ils ont un niveau de |
+ | De plus, ils ont un niveau de priorité BAS au sein du MFP, c'est |
pourquoi nous ne les utiliseront pas pour installer nos program- |
pourquoi nous ne les utiliseront pas pour installer nos program- |
||
mes sous interrupton. |
mes sous interrupton. |
||
Line 615: | Line 615: | ||
--------------------------- |
--------------------------- |
||
On trouve 24 registres d'une taille d'1 OCTET chacun : |
On trouve 24 registres d'une taille d'1 OCTET chacun : |
||
− | Ces registres se situent en |
+ | Ces registres se situent en mémoire à partir de l'adresse $FFFA01 |
sur des adresses IMPAIRES. |
sur des adresses IMPAIRES. |
||
− | Ces registres font partie |
+ | Ces registres font partie intégrante de la mémoire de notre ST. |
On peut atteindre tous ces registres en MODE SUPERVISEUR, il |
On peut atteindre tous ces registres en MODE SUPERVISEUR, il |
||
− | suffira de |
+ | suffira de déposer la nouvelle valeur du registre à l'adresse |
correspondante.(Comme avec les variables système) |
correspondante.(Comme avec les variables système) |
||
Line 629: | Line 629: | ||
NR°) NOM :Indications (ADRESSE) |
NR°) NOM :Indications (ADRESSE) |
||
------------------------------- |
------------------------------- |
||
− | 1) GPIP:Drapeau de lecture ou d' |
+ | 1) GPIP:Drapeau de lecture ou d'écriture par le port parallèle |
($FFFA01) |
($FFFA01) |
||
Line 636: | Line 636: | ||
($FFFA03) |
($FFFA03) |
||
− | 3) DDR :Affecte un sens de transmission ( |
+ | 3) DDR :Affecte un sens de transmission (entrée ou sortie) aux bits |
du GPIP |
du GPIP |
||
($FFFA05) |
($FFFA05) |
||
− | 4) IERA:Vecteur bit |
+ | 4) IERA:Vecteur bit définissant le niveau d'IPL du MFP à bloquer: |
IPLs de 15 à 8, Voir les interruptions du MFP plus haut |
IPLs de 15 à 8, Voir les interruptions du MFP plus haut |
||
($FFFA07) |
($FFFA07) |
||
Line 653: | Line 653: | ||
Bit 0: niveau 8 |
Bit 0: niveau 8 |
||
− | 5) IERB:Vecteur bit |
+ | 5) IERB:Vecteur bit définissant le niveau d'IPL du MFP à bloquer: |
IPLs de 8 à 0, Voir les interruptions du MFP plus haut |
IPLs de 8 à 0, Voir les interruptions du MFP plus haut |
||
($FFFA09) |
($FFFA09) |
||
Line 666: | Line 666: | ||
Bit 0: niveau 0 |
Bit 0: niveau 0 |
||
− | 6) IPRA:Vecteur bit |
+ | 6) IPRA:Vecteur bit enclenché automatiquement qui marque l'IPL au |
− | sein du MFP (bit à 1 = IPL actif) qui est |
+ | sein du MFP (bit à 1 = IPL actif) qui est activé,Voir les |
− | interruptions du MFP pour les |
+ | interruptions du MFP pour les détails sur les IPLs. |
($FFFA0B) |
($FFFA0B) |
||
Line 681: | Line 681: | ||
− | 7) IPRB:Vecteur bit |
+ | 7) IPRB:Vecteur bit enclenché automatiquement qui marque l'IPL au |
− | sein du MFP (bit à 1 = IPL actif) qui est |
+ | sein du MFP (bit à 1 = IPL actif) qui est activé,Voir les |
− | interruptions du MFP pour les |
+ | interruptions du MFP pour les détails sur les IPLs. |
($FFFA0D) |
($FFFA0D) |
||
Line 759: | Line 759: | ||
TIMERs plus loin, pas de panique !) |
TIMERs plus loin, pas de panique !) |
||
. Bits nr°4 à 7, permet de modifier le nr° du VECTEUR qui sera |
. Bits nr°4 à 7, permet de modifier le nr° du VECTEUR qui sera |
||
− | + | exécuté |
|
($FFFA17) |
($FFFA17) |
||
Line 765: | Line 765: | ||
13) TACR:Vecteur bit qui controle le TIMER A: |
13) TACR:Vecteur bit qui controle le TIMER A: |
||
ATTENTION, seuls les bits 0 à 3 du Registre TACR sont |
ATTENTION, seuls les bits 0 à 3 du Registre TACR sont |
||
− | + | utilisés !!! |
|
($FFFA19) |
($FFFA19) |
||
Line 800: | Line 800: | ||
- Le MFP 68901 travaille avec une horloge interne de 24,576 Mhz |
- Le MFP 68901 travaille avec une horloge interne de 24,576 Mhz |
||
− | - Le TIMER A est essentiellement |
+ | - Le TIMER A est essentiellement composé d'un REGISTRE DE CONTROLE et |
d'un REGISTRE DE DONNEE. -------------------- |
d'un REGISTRE DE DONNEE. -------------------- |
||
------------------ |
------------------ |
||
Le REGISTRE DE CONTROLE indique le mode de fonctionnement du TIMER, |
Le REGISTRE DE CONTROLE indique le mode de fonctionnement du TIMER, |
||
− | il s'agit du registre |
+ | il s'agit du registre décrit ci-dessus, le registre TACR. |
− | C'est en positionnant le registre TACR sur les |
+ | C'est en positionnant le registre TACR sur les différentes valeurs |
− | + | acceptées (Voir le tableau), qu'on obtient les différents modes de |
|
fonctionnement du TIMER: |
fonctionnement du TIMER: |
||
− | les |
+ | les différents MODES DE FONCTIONNEMENT DU TIMER A sont: |
------------------------------------------------------- |
------------------------------------------------------- |
||
. Le DELAY MODE: |
. Le DELAY MODE: |
||
-------------- |
-------------- |
||
− | Le REGISTRE DE DONNEE du TIMER est |
+ | Le REGISTRE DE DONNEE du TIMER est décrémenté à intervals réguliers |
(à chaque battement de l'horloge interne contenue dans le diviseur) |
(à chaque battement de l'horloge interne contenue dans le diviseur) |
||
− | seur)et quand ce registre vaudra 1 ,une interruption sera |
+ | seur)et quand ce registre vaudra 1 ,une interruption sera générée. |
NB: Le registre de DONNEE devra ètre une valeur comprise entre 1 |
NB: Le registre de DONNEE devra ètre une valeur comprise entre 1 |
||
Line 824: | Line 824: | ||
------- |
------- |
||
On est en MODE DELAY (voir Tableau) |
On est en MODE DELAY (voir Tableau) |
||
− | Le registre de controle TACR vaut %11 et le |
+ | Le registre de controle TACR vaut %11 et le prédiviseur vaut 16 |
(Regardez le Tableau) ------------- ------------------- |
(Regardez le Tableau) ------------- ------------------- |
||
− | Si on positionne le registre de |
+ | Si on positionne le registre de donnée sur 200 par exemple, notre |
− | programme sous interruption sera |
+ | programme sous interruption sera appelé: --------------- |
245760/16/200=76,8 fois par secondes ... |
245760/16/200=76,8 fois par secondes ... |
||
Line 836: | Line 836: | ||
Autre Exemple:TACR=%0010 (voir Tableau) |
Autre Exemple:TACR=%0010 (voir Tableau) |
||
− | Le registre de control TACR vaut %10 et le |
+ | Le registre de control TACR vaut %10 et le prédiviseur vaut 10 |
(Regardez le Tableau) ------------- ------------------- |
(Regardez le Tableau) ------------- ------------------- |
||
− | Si on positionne le registre de |
+ | Si on positionne le registre de donnée sur 32 par exemple, notre |
− | programme sous interruption sera |
+ | programme sous interruption sera appelé: -------------- |
245760/10/32=768 fois par secondes ... |
245760/10/32=768 fois par secondes ... |
||
Line 847: | Line 847: | ||
+-----------------------------------+ |
+-----------------------------------+ |
||
− | J'y reviendrai quand nous |
+ | J'y reviendrai quand nous écrirons nos premiers programmes... |
Line 857: | Line 857: | ||
. Le MODE MESURE DE LARGEUR D'IMPULSION: |
. Le MODE MESURE DE LARGEUR D'IMPULSION: |
||
-------------------------------------- |
-------------------------------------- |
||
− | Identique au DELAY MODE, mais il peut être |
+ | Identique au DELAY MODE, mais il peut être annulé par une actvité |
− | des broches d' |
+ | des broches d'entrée ou sortie du MFP. |
Line 864: | Line 864: | ||
Nous utiliseront surtout le DELAY MODE ... |
Nous utiliseront surtout le DELAY MODE ... |
||
− | Relisez attentivement ce qui a |
+ | Relisez attentivement ce qui a été dit ici, car c'est vraiment très |
important... |
important... |
||
Latest revision as of 21:04, 17 December 2023
------------------------ Les INTERRUPTIONS et les VARIABLES SYSTEME ------------------------ Avant de commencer à vous parler des programmes sous interruption, nous allons étudier: *** LES VARIABLES SYSTEME *** ----------------------------- - Les VARIABLES SYSTEME sont diverses informations qui nous sont dispo- nibles en lecture et en écriture et qui se situent au début du second KO de la RAM de notre ST. (L'emplacement en RAM varie si vous possèdez un MEGA ST au un ST dont le système d'exploitation (le TOS) n'est pas en ROM, mais il ne varie pas entre les différentes versions de ROM) - Pour atteindre ces variables, il faudra d'abord se positonner en MODE SUPERVISEUR, sinon attention au plantage...(Erreur de BUS:2 bombes !) Les variables systèmes sont soit des OCTETS soit des MOTS soit des L-M. - Nous allons nous servir de certaines de ces VARIABLES SYSTEME, elles influences grandement le fonctionnement du ST: Voilà les adresses ou se situent ces différentes variables ainsi que leurs noms , leurs tailles et leurs utilité: Les noms ci-dessous sont les noms standard donnés par ATARI à ces variables ,les adresses qui leur sont attribuées sont uniquement valables pour les ST avec le TOS en RAM. ADRESSE | NOM + TAILLE | UTILITE . $400 evt_timer (.L) : C'est un vecteur qui pointe sur l'adresse $FCA648 ( Je donne les adresses valables pour les ST avec TOS en ROM ) et qui per- met l'exécution des fonctions périodiques du GEM. . $404 evt_critic (.W) : C'est un vecteur qui pointe sur l'adresse $2A156 et qui est utilisé quand le système d'exploitation doit traiter une erreur pro venant du lecteur de disquette. ( Lecteur ne répond pas... ) . $408 evt_term (.L) : C'est un vecteur qui est utilisé par les fonctions de type _TERM du Gemdos qui ser- vent à finir l'exécution d'un programme. . $40C evt_xtra 5*(.L) : 5 L-M y sont réservés pour des applications futures... . $420 memvalid (.L) : Sémaphore pour une configuration de controleur de mémoire valide. . $424 memctrl (.B) : Si memctrl=4 l'ordi est un 520 ST Si memctrl=5 l'ordi est un 1040 ST Si memctrl=10 c'est un MEGA ST Si memctrl=0 c'est un 128 ST . $426 resvalid (.L) : Si il vaut $31415926 (soit PI sans la vir- gule) l'adresse pointée par resvector sera utilisée comme vecteur lors d'un RESET. . $42A resvector (.L) : Le vecteur utilisé par resvalid lors d'un RESET. . $42E phystop (.L) : Adresse de la fin de la mémoire vidéo physique. . $432 _membot (.L) : Adresse du début de la zone de la mémoire réservée pour le programmeur.(voir organi- sation de la mémoire plus loin) . $436 _memtop (.L) : Adresse de la fin de cette zone ( $78000 pour un 520 ST ou $F8000 pour un 1040 ST) . $43A memval2 (.L) : Si memval2=$237698AA, le L-M confirme memvalid . $43E flock (.L) : Si flock est différent de 0, la VBL est arrêtée (Voir plus loin pour VBL) . $440 seekrate (.W) : Permet de selectionner la vitesse de dé- placement de la tête de lecture du lecteur de disquette d'une piste : 0=6 ms,1=12 ms,2=2 ms,3=3 ms . $442 _timer_ms (.W) : Temps écoulé entre 2 appels du timer, soit la vitesse des battements de l'horloge in- terne. (en millisecondes) Vous y trouverez toujours 20 ms soit 50 Hz (Voir plus loin pour les TIMERS) . $444 _fverify (.W) : Si _fverify est différent de 0, il y a un test d'écriture qui est effectué par le lecteur de disquette:A chaque écriture, il relit l'octet écris et le compare a l'oc- tet à écrire. En cas d'erreur, on obtient un code d'erreur . $446 _bootdev (.W) : Contient le numéro du lecteur de disquette qui a chargé le système d'éxploitation. . $448 palmode (.W) : Drapeau qui indique soit que le système se trouve en mode vidéo 50 Hz (PAL) si palmo- de est différent de 0 soit qu'on est en mode vidéo 60 Hz (Standard NTSC) . $44A defshiftmd (.W) : Contient la résolution de l'écran dans la- quelle on se trouve si on passe d'un écran Haute résolution à un écran Couleur. (0=basse,1=moyenne) . $44C sshiftmd (.W) : Contient la résolution de l'écran dans la- quelle on se trouve:0=BASSE,1=MOYENNE, 2=HAUTE . $44E _v_bas_ad (.L) : Contient l'adresse du début de la mémoire vidéo logique.C'est obligatoirement un multiple de 256 . $452 vblsem (.W) : Si cette valeur est nulle, la VBL n'est plus exécutée:Voir plus loin pour la VBL . $454 nvbls (.W) : Contient le nombre de routines exécutées lors du VBL (Logiquement 8) . $456 _vblqueue (.L) : Vecteur qui pointe sur les adresses des routines exécutées lors du VBL . $45A colorptr (.L) : Si ce L-M est différent de 0,il est inter- prété comme l'adresse d'une nouvelle palette de couleurs. . $45E screenpt (.L) : Si ce L-M n'est pas nul, il sera interpré- té comme l'adresse de la nouvelle mémoire vidéo physique. . $462 _vbclock (.L) : C'est le compteur d'interruptions de la VBL (Voir le chapitre suivant) . $466 _frclock (.L) : Contient le nombre de routines VBL qui ne sont pas bloquées par vblsem. Ce nombre sert aussi à la fonction RANDOM de l'XBIOS pour obtenir un nombre aléatoi- re. . $46A hdv_init (.L) : Vecteur qui pointe sur la routine d'ini- tialisation du disque dur en $FC0D60 . $46E swv_vec (.L) : Vecteur qui pointe sur la routine exécutée lorsqu'on déconnecte ou connecte un moni- teur monochrome (en $FC0020). . $472 hdv_bpb (.L) : Voir la fonction de code $7 du BIOS (Getbpb) . $476 hdv_rw (.L) : Vecteur qui pointe sur les routines d'écr- iture et de lecture de données sur disque dur. . $47A hdv_boot (.L) : Vecteur qui pointe sur la routine de lancement (BOOT) du disque dur . $47E hdv_mediach (.L) : Vecteur pour la routine MEDIACH du disque dur (Pour tester si on change le disque : voir MEDIACH de code $4 dans le BIOS) . $482 _cmdload (.W) : Si cette variable est différente de 0, le programme nommé 'COMMAND.PRG' sera chargé dès que le système d'exploitation est mis en place.Cette variable devra ètre modifi- ée sur le BOOT SECTOR. . $484 conterm (.B) : C'est un vecteur bit dont les 4 premiers bits sont utilisés.Si un de ces bits est actif,la fonction est utilsée, sinon elle est déconnectée. Bit nr° 0 :BIP à chaque touche enfoncée Bit nr° 1 :Répétition au clavier Bit nr° 2 :Control+G donne un BIP Bit nr° 3 :Permet de règler la fonction BCONIN du BIOS. . $492 themd2 (.L) : Adresse du début de la mémoire disponible . $496 themd3 (.L) : Adresse de la fin de la mémoire disponible . $4A2 savptr (.L) : Adresse ($90C) qui pointe une zone de la mémoire utilisée pour la sauvegarde des registres par le PROCESSEUR après un appel à une fonction BIOS ou XBIOS . $4A6 _nflops (.W) : Contient le nombre de lecteurs de disquette connectés. . $4A8 con_state (.L) : Vecteur pointant sur les routines de code ('ESC' + 'valeur') pour les effets des éditions graphiques de texte. . $4AC save_row (.W) : Mémoire temporaire de la position du cur- seur du texte pour la fonction ESC+'Y' . $4AE sav_context (.L) : Adresse pointant sur une mémoire tempo- raire utilisée en cas de traitement d'une procédure d'exeption. . $4BA _hz_200 (.L) : Le timer du système qui est incrémenté 200 fois par seconde. . $4BC _the_env (.L) : La chaine de caractère prise par défaut , positionnée sur 4 octets nuls... . $4C2 _drvbits (.L) : Vecteur bit représentant suivant le nr° du bits actif le ou les drives connectés. . $4C6 _dskbufp (.L) : Tampon de 1 KO utilisé par les opérations de disk. . $4CE _vbl_list 8*(.L) : Vecteur qui pointe sur les adresses des 8 routines qui sont exécutées dans la VBL. . $4EE _dumpflg 8*(.L) : Sémaphore utilisée par la fonction de Hardcopy activée par l'appui de Alternate et Help. . $4F2 _sysbase (.L) : Adresse du début du système d'exploitation ($FC0000 sur les ST avec TOS en ROM) . $4FA _end_tos (.L) : Adresse de la fin du système d'exploita- tion ($A100 sur les ST avec TOS en ROM) . $4FE exec_os (.L) : Adresse du début de l'AES ($FD91D0) . $502 dump_vec (.L) : Vecteur qui pointe sur la routine de hardcopy de la fonction 20 du XBIOS. . $506 prt_stat (.L) : Sémaphore pour l'état de l'imprimante . $50A prt_vec (.L) : Vecteur pour les fonctions d'édition sur imprimante . $50E aux_sta (.L) : Vecteur de recherche d'état utilisé par une fonction de Hardcopy . $512 aux_vec (.L) : Vecteur de sortie utilisé par une fonction de Hardcopy Voilà la liste de ces variables systèmes, pour les modifier, il suffira donc de se mettre en MODE SUPERVISEUR et d'y déposer la valeur que vous voulez...(Vous pouvez bien sur aussi vous contenter de lire les données qui y sont déposées...) Ainsi, si vous voulez connaitre la résolution: Vous écrirez: * ;LECTURE d'une VARIABLE SYSTEME: SUPER ;MACRO de passage en MODE SUPERVISEUR move.w $44C,d0 ;$44C=sshiftmd et Vous obtenez la résolution de l'écran dans d0.W !!! Si vous voulez changer la palette des couleurs, vous écrirez: * ;ECRITURE sur une VARIABLE SYSTEME: SUPER ;MACRO de passage en MODE SUPERVISEUR move.l #PAL,$45A ;adresse de 'PAL' en $45A=colorptr DATA PAL DC.W $777,$007,$700,$070,$777,$777,$777,$777 ;les 16 couleurs DC.W $777,$777,$777,$000,$000,$123,$456,$789 et Vous changez la palette des couleurs !!! Cette méthode s'applique à toutes les variables système... Ces variables présentent un très grand intérêt pour nous car grƒce à elles, il n'est plus utile d'appeller certaines fonctions du BIOS, de l'XBIOS ou du GEMDOS pour obtenir des effets graphiques de base comme le changement de la palette,obtenir la résolution... : Voilà qui nous sera vraiment très utile car ces variables systèmes se laissent très facilement modifier ou lire.Mais le plus grand intérêt qu'on peut en tirer,c'est que modifer une variable système ne nécessi- te pas l'utilisation de registres (SP ou des valeurs en RETOUR) ,con- trairement aux fonction de BIOS,XBIOS ou GEMDOS... Cela nous sera vraiment très utile quand nous ferons nos premiers programmes sous interruption... *** LES PROGRAMMES SOUS-INTERRUPTION *** ---------------------------------------- - Un programme sous interruption est un programme qui doit ètre exécuté périodiquement, à intervals réguliers. Un tel programme sera source d'un TRAITEMENT D'EXCEPTION: Il sera exécuté si une certaine condition est vérifiée ( En pratique: après l'écoulement d'un certain temps de latence ) et sera interrompu ( Dès la rencontre d'instructions prévues à cet effet ) pour n'être à nouveau appelé que lorsque la condition se retrouvera réalisée. Un programme sous-interruption n'arrète aucune fonction de l'ordi.: Il est entièrement gèré à part. Il est tout à fait possible que votre programme principal effectue une boucle et qu'EN MEME TEMPS, un programme sous interruption s'e- xécute sans interrompre le programme principal !! C'est d'ailleurs cette propriété qui rend les programmes sous inter- ruption si utiles... (Pour ne pas dire indispensable, car il existe toujours des routines sous interruption qui sont activées en permanence pour des raisons vitales ...) Nous étudierons tout cela en détail très bientot, pas de panique ! - Il existe des ROUTINES D'EXCEPTION qui sont exécutées par le système d'exploitation si une certaine condition (spécifique) est vérifiée. Ce sont des programmes exécutés exeptionnelement (d'o— leur nom !), c.à.d. si la condition qui les actives se trouve réalisée. Ces programmes d'exception sont pointés par une suite de VECTEURS qui se situent dans le premier KO de la mémoire et qui pointent l'adresse de la ROUTINE D'EXCEPTION conscernée. Ils sont responsables d'un certain nombre de fonctions vitales de notre MICROPROCESSEUR. On peut considèrer que les programmes sous interruption sont des programmes d'exception. En pratique: Vous avez surement déjà vu un certain nombre de BOMBES s'afficher à l'écran quand vous avez créé un programme qui ne marchait pas corr- ectement.Ces bombes servent à identifier la source de l'erreur pour le programmeur (ou l'utilisateur) et proviennent d'un traitement d'exception. Il existe 255 VECTEURS D'EXCEPTION et le nombre de bombes qui s'affichent vous renseigne sur le nr° de l'exception qui a été solicité. Voilà les différents VECTEURS D'EXECPTION ainsi que leurs emplacements en mémoire. Ce sont des L-M car ce sont des ADRESSES qui pointent sur des routines spécifiques au VECTEUR conscerné. NR° DU VECTEUR : ADRESSE DU : ROUTINE et UTILISATION VECTEUR 0 : $000 :SP après un RESET (.L) 1 : $004 :PC après un RESET (.L) 2 : $008 :ERREUR de BUS (2 BOMBES) 3 : $00C :ERREUR d'ADRESSE (3 BOMBES) 4 : $010 :INTRUCTION ILLEGALE (4 BOMBES) 5 : $014 :ERREUR car une DIVISION par ZERO a été détectée. (La routine n'est en fait qu'un RTE !) 6 : $018 :Utilisé par CHK 7 : $01C :Utilisé par TRAPV 8 : $020 :VIOLATION DE PRIVILEGE:On a essayé de toucher à des données uniquement acc- ésibles en MODE SUPERVISEUR 9 : $024 :Adresse de la routine exécutée après chaque instruction en mode TRACE 10 : $028 :ERREUR d'émulation de LINEA 11 : $02C :ERREUR d'émulation de LINEF 12 à 14 : $030 :Réservé pour des applications futures 15 : $03C :INTERRUPTION NON INITIALISEE 16 à 23 : $040 :Réservé pour des applications futures 24 : $060 :INTERRUPTION secondaire 25 : $064 :IPL 1 26 : $068 :IPL 2 27 : $06C :IPL 3 28 : $070 :IPL 4 29 : $074 :IPL 5 30 : $078 :IPL 6 31 : $07C :IPL 7 32 : $080 :Utilisé par TRAP #0 33 : $084 :Utilisé par TRAP #1 (GEMDOS) 34 : $088 :Utilisé par TRAP #2 (AES/VDI) 35 : $08C :Utilisé par TRAP #3 36 : $090 :Utilisé par TRAP #4 37 : $094 :Utilisé par TRAP #5 38 : $098 :Utilisé par TRAP #6 39 : $09C :Utilisé par TRAP #7 40 : $0A0 :Utilisé par TRAP #8 41 : $0A4 :Utilisé par TRAP #9 42 : $0A8 :Utilisé par TRAP #10 43 : $0AC :Utilisé par TRAP #11 44 : $0B0 :Utilisé par TRAP #12 45 : $0B4 :Utilisé par TRAP #13 (BIOS) 46 : $0B8 :Utilisé par TRAP #14 (XBIOS) 47 : $0BC :Utilisé par TRAP #15 48 à 63 : $0C0 :Réservé 64 à 255 : $100 :disponibles à l'utilisateur, on y trouve notament: 68 : $110 :Interruption du TIMER D 69 : $114 :Interruption du TIMER C 72 : $120 :Interruption du TIMER B 77 : $134 :Interruption du TIMER A Le détail viendra plus loin. En pratique, si votre programme affiche 3 BOMBES avant de rendre l'ƒme, c'est qu'une erreur d'adresse a été détectée, si il en affiche 4,c'est qu'une instruction illégale a été détectée... Voilà maintenant comment l'ordi. s'y prend pour exécuter une ROUTINE d'EXEPTION: .Sauvegarde de SR dans un registre interne. .Passage en mode SUPERVISEUR par activation du bit S de SR. .Anulation du mode TRACE par extinction du bit T du SR (Explications sur le Mode TRACE plus loin). .Recherche du vecteur d'exeption à utiliser. .Empilement du PC et du SR dans la pile système. .Chargement dans le PC de l'adresse que contient le VECTEUR d'EXCEPTION choisi :Saut à la routine correspondante... .Exécution du programme d'exCeption et retour dès la rencontre d'un RTE (Return From Exception) .Restauration des registres SR et PC. Il est tout à fait possible de modifier ces vecteurs, il suffit de dépose l'adresse (L-M) de la nouvelle routine à exécuter à l'adresse du vecteur à modifer. (MOVE.L #NEW,$vecteur) Ceci aurra pour effet de détourner l'exécution de la ROUTINE D'EXCEP- TION vers votre propre routine... Nous verrons cela en détail quand je parlerais du mode TRACE. Mais revenons à nos programmes sous interruption. Pour pouvoir gèrer plusieurs programmes sous interruption en même temps ,il faudra attribuer un NIVEAU DE PRIORITE à notre programme sous inter- ruption. Plus ce NIVEAU DE PRIORITE sera élevé, et plus grande sera l'importance accordée à notre programme dans la hiérarchie. Le NIVEAU DE PRIORITE de notre programme sera définit par l'état des BITS I1,I2,I3 du REGISTRE D'ETAT 'SR' (Disponible UNIQUEMENT en MODE SUPERVISEUR !!) Ces 3 BITS permettent de définir 8 niveaux de priorité. BITS I1 I2 I0 = % NIVEAU (ou Interrupt Priority Level) % 1 1 1 7 % 1 1 0 6 % 1 0 1 5 % 1 0 0 4 % 0 1 1 3 % 0 1 0 2 % 0 0 1 1 % 0 0 0 0 Un programme de NIVEAU D'INTERRUPTION (ou d'Interrupt Priority Level :'IPL') 0 sera donc interrompu par tout autre programme d'IPL ò 1,un programme d'IPL 1 ne sera interrompu que par un programme d'IPL ò 2 mais restera indifférent à un programme sous interruption d'IPL 0,et celui-ci ne sera donc pas exécuté car son IPL est < 1 etc... Le NIVEAU 0 est théoriquement celui de votre programme. (Niveau le plus bas) Le NIVEAU 7 est théoriquement le niveau d'IPL qui permettra au prg sous interruption qui en est affecté qu'aucun autre programme sous interruption ne puisse l'interrompre. (Il pourrait par exemple s'agir du RESET,qui a une priorité ABSOLUE) . En pratique, seuls les niveaux 2,4 et 6 sont utilisés. l'IPL 2 est utilisé par le HBL l'IPL 4 est utilisé par les routines du VBL l'IPL 6 est utilisé par les interruptions du MFP 68901 le HBL: Horizontal BLank ------- Il s'agit en réalité d'une routine exécutée après que le SHIFTER affiche 1 ligne horizontale sur l'écran. Suivant le type de moniteur connecté, la routine est appellée toutes les 50 microsecondes (50Hz) ou toutes le 64 microsecondes (64 Hz) Un moniteur couleur possède 200 lignes horizontales, l'écran est 'ra- fraichit' 50 fois par secondes (50 Hz), la routine de l'HBL est donc appelé 10000 fois par seconde dans certaines conditions ! Cette routine ralentirait énormément l'ordi. ,c'est pourquoi la routine de l'HBL n'est pas exécutée. (heuresement pour nous !) En effet, dès son premier appel,la routine positionnera automatiquement l'IPL de notre programme sur un niveau d'IPL 3: la routine ne sera donc plus appellée car elle a un niveau d'IPL 2... NB: Il est possible de détourner cette routine: -- Il suffit de déposer l'adresse de votre routine dans le 26°ème VECTEUR d'EXCEPTION qui pointe sur la routine de l'HBL (.L) et de remettre l'IPL du programme à un niveau < 2 ( En modifiant les bits I1,I2,I3 du registre d'état ) Votre routine devra aussi se terminer par l'instruction RTE (Return From Exception), mais nous en reparlerons bientot... (Le tout en mode SUPERVISEUR, ne l'oubliez pas !) les routines du VBL :Vertical BLank ------------------- Elles ont un niveau d'interruption 4, elles sont donc prioritaires vis-à-vis de l'interrution de l'HBL. Ces routines sont exécutées après qu'un écran graphique ( 200 ou 400 lignes horizontales suivant la résolution) ait été édité en entier sur le moniteur. Elles s'exécutent donc 50 fois par seconde (50 Hz). Les routines de la VBL s'occuppent du changement de la palette des couleurs ( Uniquement après qu'une image a été dessinée en entier pour éviter de perturber l'image ),elles testent le changement de disquette ... Il y a en tout 8 routines, le nombre de routines disponibles est contenu dans la variable système NVBLS et il existe un vecteur qui pointe sur les 8 adresses de ces routines, en VBLQUEUE. En réalité, seule 1 routine est exécutée : Les 7 autres nous sont donc disponibles... Les interruptions du MFP 68901 (Multi Fonction Peripheral) ------------------------------ Le MFP 68901 gére 16 interruptions,elles ont un niveau de priorité 6, elles sont donc prioritaires vis-à-vis des interruptions VBL et HBL. Les 16 interruptions du MFP 68901 ont aussi des niveaux de priorité différent entre elles ! Ainsi, une interruption du MFP de niveau 6 ne pourra que ètre inter- rompue par une autre interruption de niveau > 6 etc... Voilà les différentes interruptions du MFP 68901 , classées par niveau de priorité (noté x sur l'ILP 6 du MFP ). NIVEAU (x/6) : L'interruption 15/6 : Détecteur de branchement ou de débranchement du moniteur haute résolution 14/6 : Ring indicator de l'interface RS232 13/6 : TIMER A de l'horloge interne 12/6 : Tampon de réception d'1 caractère à parir de la RS232 destiné à l'utilisateur 11/6 : Erreur de réception d'1 caractère provenant de l'interface RS232 10/6 : Tampon temporaire d'émission d'1 caractère à destination de la RS232 9/6 : Erreur d'émission d'1 caractère provenant de la RS232 8/6 : TIMER B et Compteur de retour à la ligne 7/6 : Routine de controle des lecteurs de disquette et du DMA 6/6 : Routines de controle du clavier (ACIAs) et de la prise MIDI (En entrée et sortie) 5/6 : TIMER C utilisé par le YM-2149 (Son) ,le clavier et le compteur de synchronisation du système (à 200 Hz) 4/6 : TIMER D utilisé pour les opérations d'émission et de réception de la RS232 3/6 : Inutilisé 2/6 : Routine de controle du CTS de la RS232 1/6 : Routine de controle du DCD de la RS232 0/6 : Utilisé par le BUSY de l'interface CENTRONICS pour créer un spooler d'imprimante. Les termes ci dessus ne seront pas expliqués, vous n'aurez pas à vous en servir de toute manière, alors pourquoi compliquer ce qui n'est pas déjà si simple ? Nous allons tout de mème détailler et expliquer les modes de fonction- nement des TIMERS, car c'est leur programmation qui va nous permettre de réaliser nos programmes sous interruption. Les TIMERS: Comme vous avez pu le constater, il existe 4 TIMERS: Le TIMER A, le TIMER B, le TIMER C, le TIMER D. . Le TIMER A est entièremet disponible au programmeur et a un niveau de priorité 13 au sein du MFP (élevé!) . Le TIMER B est utilisé comme compteur de retour à la ligne mais vous pourrez très facilement le détourner.Il a un niveau de priorité 8 au sein du MFP ( IPL < à l'IPL du TIMER A) . Les TIMERs C et D sont responsables d'un certain nombre de fonctions importantes (gestion du son,du clavier ...), les détourner peut donc poser beaucoup de problèmes... De plus, ils ont un niveau de priorité BAS au sein du MFP, c'est pourquoi nous ne les utiliseront pas pour installer nos program- mes sous interrupton. La programmation des TIMERS se fait d'une manière très particu- lière: Il faudra programmer directement les registres du CO-PROCESSEUR MFP 68901 !! Les REGISTRES DU MFP 68901: --------------------------- On trouve 24 registres d'une taille d'1 OCTET chacun : Ces registres se situent en mémoire à partir de l'adresse $FFFA01 sur des adresses IMPAIRES. Ces registres font partie intégrante de la mémoire de notre ST. On peut atteindre tous ces registres en MODE SUPERVISEUR, il suffira de déposer la nouvelle valeur du registre à l'adresse correspondante.(Comme avec les variables système) Nous n'utiliserons qu'une petite partie de ces registres, les voici: NR°) NOM :Indications (ADRESSE) ------------------------------- 1) GPIP:Drapeau de lecture ou d'écriture par le port parallèle ($FFFA01) 2) AER :Donne des information sur le mode de fonctionnement de l'interruption ($FFFA03) 3) DDR :Affecte un sens de transmission (entrée ou sortie) aux bits du GPIP ($FFFA05) 4) IERA:Vecteur bit définissant le niveau d'IPL du MFP à bloquer: IPLs de 15 à 8, Voir les interruptions du MFP plus haut ($FFFA07) Bit 7: niveau 15 Bit 6: niveau 14 Bit 5: niveau 13 Bit 4: niveau 12 Bit 3: niveau 11 Bit 2: niveau 10 Bit 1: niveau 9 Bit 0: niveau 8 5) IERB:Vecteur bit définissant le niveau d'IPL du MFP à bloquer: IPLs de 8 à 0, Voir les interruptions du MFP plus haut ($FFFA09) Bit 7: niveau 7 Bit 6: niveau 6 Bit 5: niveau 5 Bit 4: niveau 4 Bit 3: niveau 3 Bit 2: niveau 2 Bit 1: niveau 1 Bit 0: niveau 0 6) IPRA:Vecteur bit enclenché automatiquement qui marque l'IPL au sein du MFP (bit à 1 = IPL actif) qui est activé,Voir les interruptions du MFP pour les détails sur les IPLs. ($FFFA0B) Bit 7: niveau 15 Bit 6: niveau 14 Bit 5: niveau 13 Bit 4: niveau 12 Bit 3: niveau 11 Bit 2: niveau 10 Bit 1: niveau 9 Bit 0: niveau 8 7) IPRB:Vecteur bit enclenché automatiquement qui marque l'IPL au sein du MFP (bit à 1 = IPL actif) qui est activé,Voir les interruptions du MFP pour les détails sur les IPLs. ($FFFA0D) Bit 7: niveau 7 Bit 6: niveau 6 Bit 5: niveau 5 Bit 4: niveau 4 Bit 3: niveau 3 Bit 2: niveau 2 Bit 1: niveau 1 Bit 0: niveau 0 8) ISRA:Vecteur bit qui donne les interruptions actives. Voir les interruptions du MFP plus haut pour les equiva- lences des niveaux d'IPLs. ($FFFA0F) Bit 7: niveau 15 Bit 6: niveau 14 Bit 5: niveau 13 Bit 4: niveau 12 Bit 3: niveau 11 Bit 2: niveau 10 Bit 1: niveau 9 Bit 0: niveau 8 9) ISRB:Vecteur bit qui donne les interruptions actives. Voir les interruptions du MFP... ($FFFA11) Bit 7: niveau 7 Bit 6: niveau 6 Bit 5: niveau 5 Bit 4: niveau 4 Bit 3: niveau 3 Bit 2: niveau 2 Bit 1: niveau 1 Bit 0: niveau 0 10) IMRA:Vecteur bit dans lequel on doit indiquer (par un 1),le niveau d'IPL qu'on utilise.( bit nr° 5=IPL 13 si on utilise le TIMER A etc...) ($FFFA13) Bit 7: niveau 15 Bit 6: niveau 14 Bit 5: niveau 13 Bit 4: niveau 12 Bit 3: niveau 11 Bit 2: niveau 10 Bit 1: niveau 9 Bit 0: niveau 8 11) IMRB:Vecteur bit dans lequel on doit indiquer (par un 1),le niveau d'IPL qu'on utilise.( bit nr° 5=IPL 5 si on utilise le TIMER C etc...) ($FFFA15) Bit 7: niveau 7 Bit 6: niveau 6 Bit 5: niveau 5 Bit 4: niveau 4 Bit 3: niveau 3 Bit 2: niveau 2 Bit 1: niveau 1 Bit 0: niveau 0 12) VR :Vecteur bit: . Bit nr°3 permet d'obtenir le mode AUTOMATIC END OF INTERRUPT ,dans ce cas (bit nr°3 à 1), il ne sera plus utile de modi- fier les registres IPR,ISR,IMR ( Voir la programmation des TIMERs plus loin, pas de panique !) . Bits nr°4 à 7, permet de modifier le nr° du VECTEUR qui sera exécuté ($FFFA17) 13) TACR:Vecteur bit qui controle le TIMER A: ATTENTION, seuls les bits 0 à 3 du Registre TACR sont utilisés !!! ($FFFA19) .Nr° des bits du registre ACTION sur le TIMER A et PREDIVISEUR |76543210| | +--------+-----------------------------------------+ ****0000 STOPPE le TIMER A ****0001 DELAY MODE, /4 ****0010 DELAY MODE, /10 ****0011 DELAY MODE, /16 ****0100 DELAY MODE, /50 ****0101 DELAY MODE, /64 ****0110 DELAY MODE, /100 ****0111 DELAY MODE, /200 ****1000 EVENT COUNT MODE ****1001 MODE MESURE D'IMPULSIONS, /4 ****1010 MODE MESURE D'IMPULSIONS, /10 ****1011 MODE MESURE D'IMPULSIONS, /16 ****1100 MODE MESURE D'IMPULSIONS, /50 ****1101 MODE MESURE D'IMPULSIONS, /64 ****1110 MODE MESURE D'IMPULSIONS, /100 ****1111 MODE MESURE D'IMPULSIONS, /200 C'est le registre TACR qui permet de coder la FREQUENCE D'APPEL du TIMER A. EXPLICATIONS: ------------- - Le MFP 68901 travaille avec une horloge interne de 24,576 Mhz - Le TIMER A est essentiellement composé d'un REGISTRE DE CONTROLE et d'un REGISTRE DE DONNEE. -------------------- ------------------ Le REGISTRE DE CONTROLE indique le mode de fonctionnement du TIMER, il s'agit du registre décrit ci-dessus, le registre TACR. C'est en positionnant le registre TACR sur les différentes valeurs acceptées (Voir le tableau), qu'on obtient les différents modes de fonctionnement du TIMER: les différents MODES DE FONCTIONNEMENT DU TIMER A sont: ------------------------------------------------------- . Le DELAY MODE: -------------- Le REGISTRE DE DONNEE du TIMER est décrémenté à intervals réguliers (à chaque battement de l'horloge interne contenue dans le diviseur) seur)et quand ce registre vaudra 1 ,une interruption sera générée. NB: Le registre de DONNEE devra ètre une valeur comprise entre 1 --- et 255 Exemple:TACR=%0011 ------- On est en MODE DELAY (voir Tableau) Le registre de controle TACR vaut %11 et le prédiviseur vaut 16 (Regardez le Tableau) ------------- ------------------- Si on positionne le registre de donnée sur 200 par exemple, notre programme sous interruption sera appelé: --------------- 245760/16/200=76,8 fois par secondes ... ------------- +-----------------------------------+ Soit: |FREQUENCE DU MFP/PREDIVISEUR/DONNEE| +-----------------------------------+ Autre Exemple:TACR=%0010 (voir Tableau) Le registre de control TACR vaut %10 et le prédiviseur vaut 10 (Regardez le Tableau) ------------- ------------------- Si on positionne le registre de donnée sur 32 par exemple, notre programme sous interruption sera appelé: -------------- 245760/10/32=768 fois par secondes ... ------------ +-----------------------------------+ Soit: |FREQUENCE DU MFP/PREDIVISEUR/DONNEE| +-----------------------------------+ J'y reviendrai quand nous écrirons nos premiers programmes... . EVENT COUNT MODE: ----------------- C'est pareil, sauf qu'ici Le MFP ne tient plus compte du PREDIVISEUR... . Le MODE MESURE DE LARGEUR D'IMPULSION: -------------------------------------- Identique au DELAY MODE, mais il peut être annulé par une actvité des broches d'entrée ou sortie du MFP. Nous utiliseront surtout le DELAY MODE ... Relisez attentivement ce qui a été dit ici, car c'est vraiment très important... ----------------- PIECHOCKI Laurent 8, Impasse Bellevue Suite dans le fichier: INTER_2.DOC 57980 TENTELING -----------
Back to ASM_Tutorial