----------------- CORRECTIONS des EXERCICES NR°4 ----------------- 1) Exercice nr°1: -------------- a) Si TACR vaut %100 et que le registre de donnée vaut 42, quelle sera la fréquence d'appel d'un programme sur ce TIMER ? Avec TACR = %100, on a un prédiviseur de 50, le registre de donnée vaut 42, on a donc: fréquence=245760/50/42= environ 117 appels par seconde (Delay Mode) Le programme sera-t-il installé sur le TIMER A ou sur le TIMER B ? TACR gère le mode de fonctionnement du TIMER A. (l'avez vous déjà oublié ?) b) Comment faire pour stopper un programme sous interruption installé sous le TIMER A ? : Il suffit de mettre à 0 les 4 premiers bits du registre TACR c) On veut installer un programme sous interruption qui doit s'exécuter à peu près 245 fois par seconde, donnez une valeur possible des regi- stres de controle et de donnée pour obtenir cet effet. Si le registre de controle vaut %10, on a un prédiviseur de 10 et si le registre de donnée vaut aussi 10, on a: fréquence=245760/10/10=245,76 appels par seconde (Delay Mode) d) Peut-on installer plusieurs programmes sous interruption dans un mème TIMER ? Bien sur que NON ! Il suffit de regarder comment on fait pour installer une routine sur un TIMER, la première chose qu'on fait,c'est mettre tous les registres du TIMER conscerné à 0 pour débrancher la routine qui s'y trouvait déjà .... e) Un programme sous interruption doit obligatoirement s'exécuter en MODE SUPERVISEUR. Trouvez une raison à cela ... Une raison toute simple et qu'à la fin du programme (Avant le RTE), on efface le bit conscerné du registre ISR. Or toute modification des registres du MFP DOIT se faire en MODE SUPERVISEUR... 1) Exercice nr°2: -------------- Voilà les macros des TIMERS A et B: TIMERA MACRO $\1,$\2,$\3 ;MACRO à 3 paramètres ; Mise à 0 des différents vecteurs bit pour le TIMER A and.b #%11011111,$FFFA13 ;IMRA and.b #%11011111,$FFFA0F ;ISRA and.b #%11011111,$FFFA0B ;IPRA and.b #%11011111,$FFFA07 ;IERA ; XBTIMER et installation de notre routine pea \1 ;\1=LABEL du début de la routine ; à mettre sous interruption move.w #\2,-(sp) ;\2=registre de controle move.w #\3,-(sp) ;\3=registre de donnée move.w #0,-(sp) ;0 =TIMER A move.w #$1F,-(sp) ;XBTIMER trap #14 ;XBIOS adda.l #12,sp ;on repositionne SP ; Mise à 1 des différents vecteurs bits pour le TIMER A or.b #%100000,$FFFA07 ;IERA or.b #%100000,$FFFA13 ;IMRA ENDM ;Fin de la macro TIMER B MACRO $\1,$\2,$\3 ;MACRO à 3 paramètres ; Mise à 0 des différents vecteurs bits pour le TIMER B and.b #%11111110,$FFFA13 ;IMRB and.b #%11111110,$FFFA0F ;ISRB and.b #%11111110,$FFFA0B ;IPRB and.b #%11111110,$FFFA07 ;IERA ; XBTIMER et installation de la routine sur le TIMER B pea \1 ;\1=LABEL du début de la routine ; à mettre sous interruption move.w #\2,-(sp) ;\2=registre de controle move.w #\3,-(sp) ;\3=registre de donnée move.w #1,-(sp) ;1 = TIMER B move.w #$1F,-(sp) ;XBTIMER trap #14 ;XBIOS adda.l #12,sp ;on repositionne SP ; Mise à 1 des différents vecteurs bit or.b #%1,$FFFA07 ;IERB or.b #%1,$FFFA13 ;IMRB ENDM ;FIN de la MACRO 2) Exercice nr°3: -------------- Deux solutions existent pour stopper les TIMERS A et B. La première consiste à mettre les 4 premiers bits des registres TACR (Pour le TIMER A) ou TBCR (Pour le TIMER B) à 0. Il suffirait donc d'écrire: BCLR #0,$FFFA19 ;bit 0 du registre TACR BLCR #1,$FFFA19 ;bit 1 BCLR #2,$FFFA19 ;bit 2 BCLR #3,$FFFA19 ;bit 3 Pour le TIMER A (En MODE SUPERVISEUR !) Ou BCLR #0,$FFFA1B ;bit 0 du registre TBCR BLCR #1,$FFFA1B ;bit 1 BCLR #2,$FFFA1B ;bit 2 BCLR #3,$FFFA1B ;bit 3 Pour le TIMER B (En MODE SUPERVISEUR !) Il existe aussi une fonction de l'XBIOS qui permet de bloquer une interruption du MFP 68901: C'est le fonction JDISINT de code 26. Il suffit de passer l'IPL du MFP qui doit ètre arrèté. C'est avec cette fonction qu'on créera nos MACROS: Pour le TIMER A (De niveau 13/6 au sein du MFP), on écrira: STOPTIMEA MACRO move.w #13,-(sp) ;TIMER A ( IPL 13/6) move.w #26,-(sp) ;JDISINT trap #14 ;XBIOS addq.l #4,sp ;on repositionne SP ENDM Pour le TIMER B (De niveau 8/6 au sein du MFP), on écrira: STOPTIMEB MACRO move.w #8,-(sp) ;TIMER B ( IPL 8/6 ) move.w #26,-(sp) ;JDISINT trap #14 ;XBIOS addq.l #4,sp ;on repositionne SP ENDM 3) Exercice nr°3: -------------- Voilà le listing du programme qui fait varier la palette des couleurs sous interruption. Il n'y avait aucune difficulté. TEXT INCLUDE "INIT_TOS.L" ;Setblock INCLUDE "MACROS.L" ;Les MACROS INCLUDE "TIMERS.L" ;Le fichier des MACROS ;pour les TIMERS SETBLOCK ;initialisation SUPER ;MODE SUPERVISEUR PRINTLINE CA ;texte WAIT ;attente TIMERA ROUTINE,200,%111 ;On installe la routine ;sur le TIMER A avec le ;registre de donnée=200 ;et registre de controle ;=%111 USER ;MODE UTILISATEUR pour KEEP 2000 ;revenir au DESKTOP avec le programme ; La routine sous interruption qui change les couleurs: ROUTINE cmpi #30,TESTE ;A-t-on 30 en 'TESTE' ? bgt DEUX ;Si c'est plus grand, va en 'DEUX' move.l #PAL1,$45A ;Adresse de la nouvelle palette en ;'colorptr' add #1,TESTE ;Sinon ajoute 1 en 'TESTE' bclr #5,$FFFA0F ;Clear ISRA (bit 5=TIMER A) RTE ;RETURN FROM EXCEPTION DEUX move.l #PAL2,$45A ;Adresse de la nouvelle palette en ;'colorptr' add #1,TESTE ;Ajoute 1 en 'TESTE' cmpi #60,TESTE ;A-t-on 60 en 'TESTE' ? bne NON ;Si NON, va en 'NON' move #0,TESTE ;Met 0 en 'TESTE' NON bclr #5,$FFFA0F ;Clear ISRA (bit 5=TIMER A) RTE ;RETURN FROM EXCEPTION DATA ; La palette nr° 1 PAL1 DC.W $777,$700,$070,$000,$000,$777,$777,$777 DC.W $777,$777,$777,$777,$777,$777,$777,$777 ; La palette nr° 2 PAL2 DC.W $777,$700,$007,$000,$000,$777,$777,$777 DC.W $777,$777,$777,$777,$777,$777,$777,$777 CA DC.B 27,'E','Routine sous interruption (TIMER A )' DC.B ' qui change la',13,10,'couleur nr°3 de la' DC.B ' palette (Variable système $45A):',0 BSS DS.B 500 PILE DS.B 1 ;Pour SETBLOCK SAUV_SP DS.L 1 ;Pour SUPER et USER TESTE DS.W 1 ;Pour la routine sous interruption END 4) Exercice nr°4: -------------- Là aussi, aucune difficulté majeure... TEXT INCLUDE "INIT_TOS.L" ;SETBLOCK INCLUDE "MACROS.L" ;Les MACROS INCLUDE "TIMERS.L" ;Les MACROS des TIMERS INCLUDE "MACROS_2.L" ;La MACRO HEXA SETBLOCK ;initialisation SUPER ;MODE SUPERVISEUR PRINTLINE LA ;texte CCONOUT #13 ;13 + CCONOUT #10 ;10 = retour à la ligne en ;colonne 1 WAIT ;attente TIMERA PRG,50,%111 ;On installe notre routine ;sur le TIMER A avec le re- ;gistre de donnée = 50 et le ;registre de controle=%111 ; La boucle qui affiche les valeurs de la variable BOUCLE HEXA VAL ;Affiche le L-M de 'VAL' en HEXA CCONOUT #13 ;13 + CCONOUT #10 ;10 = retour à la ligne en colonne 1 WAIT ;attente cmpi.b #'Q',d0 ;Touche = Q ? beq RETOUR ;Si OUI, va en 'RETOUR' cmpi.b #'q',d0 ;Touche = q ? beq RETOUR ;Si OUI, va en 'RETOUR' jmp BOUCLE et on recommence en 'BOUCLE' ; La routine sous interruption qui se contente d'incrémenter le L-M ; en 'VAL' PRG add.l #1,VAL ;Ajoute 1 au L-M en 'VAL' bclr #5,$FFFA0F ;CLear ISRA (bit 5=TIMER A) RTE ;RETURN FROM EXCEPTION RETOUR USER ;MODE UTILISATEUR STOPTIMEA ;on stoppe le TIMER A TERM ;et FIN ! DATA LA DC.B 27,'E','Routine sous interruption (TIMER A )' DC.B ' qui incrémente le',13,10,'contenu de la va' DC.B 'riable affichée ([Q] pour QUITTER) ...',0 BSS DS.B 500 PILE DS.B 1 ;Pour SETBLOCK SAUV_SP DS.L 1 ;Pour SUPER et USER VAL DS.L 1 ;La variable à afficher END -------------------- Voilà, les listings et les programmes exécutables de ces exercices se trouvent dans les fichiers: 1) TIMERS .L pour les MACROS TIMERA,TIMERB,STOPTIMEA,STOPTIMEB 2) PALETTE.L pour le programme de changement de la palette sous interruption. et PALETTE.PRG 3) AFFICHE.L pour le programme d'affichage du L-M incrémenté sous interruption. et AFFICHE.PRG PIECHOCKI Laurent 8, Impasse Bellevue Suite dans le fichier:ANNEXE.DOC 57980 TENTELING ----------