Pl2 CORRIG 4.DOC/fr
Jump to navigation
Jump to search
-----------------
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 ----------
Back to ASM_Tutorial