Pl2 INTERRUP.DOC/fr
------------------------ 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