Pl2 CORRIG 4.DOC/fr: Difference between revisions

From Atari Wiki
Jump to navigation Jump to search
(Replacing content with updated version)
mNo edit summary
 
Line 12: Line 12:
 
1) Exercice nr°1:
 
1) Exercice nr°1:
 
--------------
 
--------------
a) Si TACR vaut %100 et que le registre de donn‚e vaut 42, quelle sera
+
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 ?
+
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
+
Avec TACR = %100, on a un prédiviseur de 50, le registre de donnée
 
vaut 42, on a donc:
 
vaut 42, on a donc:
   
fr‚quence=245760/50/42= environ 117 appels par seconde (Delay Mode)
+
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 ?
+
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à
+
TACR gère le mode de fonctionnement du TIMER A. (l'avez vous déjà
oubli‚ ?)
+
oublié ?)
 
 
   
   
b) Comment faire pour stopper un programme sous interruption install‚
+
b) Comment faire pour stopper un programme sous interruption installé
 
sous le TIMER A ? :
 
sous le TIMER A ? :
   
Line 34: Line 34:
 
 
   
c) On veut installer un programme sous interruption qui doit s'ex‚cuter
+
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-
 
à peu près 245 fois par seconde, donnez une valeur possible des regi-
stres de controle et de donn‚e pour obtenir cet effet.
+
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 controle vaut %10, on a un prédiviseur de 10 et
si le registre de donn‚e vaut aussi 10, on a:
+
si le registre de donnée vaut aussi 10, on a:
   
fr‚quence=245760/10/10=245,76 appels par seconde (Delay Mode)
+
fréquence=245760/10/10=245,76 appels par seconde (Delay Mode)
   
   
Line 50: Line 50:
 
Il suffit de regarder comment on fait pour installer une routine
 
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
 
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
+
registres du TIMER conscerné à 0 pour débrancher la routine qui
s'y trouvait d‚jà ....
+
s'y trouvait déjà ....
 
 
   
e) Un programme sous interruption doit obligatoirement s'ex‚cuter en
+
e) Un programme sous interruption doit obligatoirement s'exécuter en
 
MODE SUPERVISEUR.
 
MODE SUPERVISEUR.
 
Trouvez une raison à cela ...
 
Trouvez une raison à cela ...
 
 
 
Une raison toute simple et qu'à la fin du programme (Avant le RTE),
 
Une raison toute simple et qu'à la fin du programme (Avant le RTE),
on efface le bit conscern‚ du registre ISR.
+
on efface le bit conscerné du registre ISR.
 
Or toute modification des registres du MFP DOIT se faire en MODE
 
Or toute modification des registres du MFP DOIT se faire en MODE
 
SUPERVISEUR...
 
SUPERVISEUR...
Line 71: Line 71:
 
TIMERA MACRO $\1,$\2,$\3 ;MACRO à 3 paramètres
 
TIMERA MACRO $\1,$\2,$\3 ;MACRO à 3 paramètres
   
; Mise à 0 des diff‚rents vecteurs bit pour le TIMER A
+
; Mise à 0 des différents vecteurs bit pour le TIMER A
   
 
and.b #%11011111,$FFFA13 ;IMRA
 
and.b #%11011111,$FFFA13 ;IMRA
Line 80: Line 80:
 
; XBTIMER et installation de notre routine
 
; XBTIMER et installation de notre routine
   
pea \1 ;\1=LABEL du d‚but de la routine
+
pea \1 ;\1=LABEL du début de la routine
 
; à mettre sous interruption
 
; à mettre sous interruption
 
move.w #\2,-(sp) ;\2=registre de controle
 
move.w #\2,-(sp) ;\2=registre de controle
move.w #\3,-(sp) ;\3=registre de donn‚e
+
move.w #\3,-(sp) ;\3=registre de donnée
 
move.w #0,-(sp) ;0 =TIMER A
 
move.w #0,-(sp) ;0 =TIMER A
 
move.w #$1F,-(sp) ;XBTIMER
 
move.w #$1F,-(sp) ;XBTIMER
Line 89: Line 89:
 
adda.l #12,sp ;on repositionne SP
 
adda.l #12,sp ;on repositionne SP
   
; Mise à 1 des diff‚rents vecteurs bits pour le TIMER A
+
; Mise à 1 des différents vecteurs bits pour le TIMER A
   
 
or.b #%100000,$FFFA07 ;IERA
 
or.b #%100000,$FFFA07 ;IERA
Line 101: Line 101:
 
TIMER B MACRO $\1,$\2,$\3 ;MACRO à 3 paramètres
 
TIMER B MACRO $\1,$\2,$\3 ;MACRO à 3 paramètres
   
; Mise à 0 des diff‚rents vecteurs bits pour le TIMER B
+
; Mise à 0 des différents vecteurs bits pour le TIMER B
   
 
and.b #%11111110,$FFFA13 ;IMRB
 
and.b #%11111110,$FFFA13 ;IMRB
Line 110: Line 110:
 
; XBTIMER et installation de la routine sur le TIMER B
 
; XBTIMER et installation de la routine sur le TIMER B
   
pea \1 ;\1=LABEL du d‚but de la routine
+
pea \1 ;\1=LABEL du début de la routine
 
; à mettre sous interruption
 
; à mettre sous interruption
 
move.w #\2,-(sp) ;\2=registre de controle
 
move.w #\2,-(sp) ;\2=registre de controle
move.w #\3,-(sp) ;\3=registre de donn‚e
+
move.w #\3,-(sp) ;\3=registre de donnée
 
move.w #1,-(sp) ;1 = TIMER B
 
move.w #1,-(sp) ;1 = TIMER B
 
move.w #$1F,-(sp) ;XBTIMER
 
move.w #$1F,-(sp) ;XBTIMER
Line 119: Line 119:
 
adda.l #12,sp ;on repositionne SP
 
adda.l #12,sp ;on repositionne SP
   
; Mise à 1 des diff‚rents vecteurs bit
+
; Mise à 1 des différents vecteurs bit
   
 
or.b #%1,$FFFA07 ;IERB
 
or.b #%1,$FFFA07 ;IERB
Line 135: Line 135:
 
(Pour le TIMER A) ou TBCR (Pour le TIMER B) à 0.
 
(Pour le TIMER A) ou TBCR (Pour le TIMER B) à 0.
   
Il suffirait donc d'‚crire:
+
Il suffirait donc d'écrire:
   
 
BCLR #0,$FFFA19 ;bit 0 du registre TACR
 
BCLR #0,$FFFA19 ;bit 0 du registre TACR
Line 157: Line 157:
 
interruption du MFP 68901: C'est le fonction JDISINT de code 26.
 
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‚.
+
Il suffit de passer l'IPL du MFP qui doit ètre arrèté.
C'est avec cette fonction qu'on cr‚era nos MACROS:
+
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:
+
Pour le TIMER A (De niveau 13/6 au sein du MFP), on écrira:
 
 
 
STOPTIMEA MACRO
 
STOPTIMEA MACRO
Line 170: Line 170:
 
ENDM
 
ENDM
 
 
Pour le TIMER B (De niveau 8/6 au sein du MFP), on ‚crira:
+
Pour le TIMER B (De niveau 8/6 au sein du MFP), on écrira:
 
 
 
STOPTIMEB MACRO
 
STOPTIMEB MACRO
Line 185: Line 185:
 
Voilà le listing du programme qui fait varier la palette des couleurs
 
Voilà le listing du programme qui fait varier la palette des couleurs
 
sous interruption.
 
sous interruption.
Il n'y avait aucune difficult‚.
+
Il n'y avait aucune difficulté.
   
   
Line 204: Line 204:
 
TIMERA ROUTINE,200,%111 ;On installe la routine
 
TIMERA ROUTINE,200,%111 ;On installe la routine
 
;sur le TIMER A avec le
 
;sur le TIMER A avec le
;registre de donn‚e=200
+
;registre de donnée=200
 
;et registre de controle
 
;et registre de controle
 
;=%111
 
;=%111
Line 260: Line 260:
 
4) Exercice nr°4:
 
4) Exercice nr°4:
 
--------------
 
--------------
Là aussi, aucune difficult‚ majeure...
+
Là aussi, aucune difficulté majeure...
   
   
Line 282: Line 282:
 
TIMERA PRG,50,%111 ;On installe notre routine
 
TIMERA PRG,50,%111 ;On installe notre routine
 
;sur le TIMER A avec le re-
 
;sur le TIMER A avec le re-
;gistre de donn‚e = 50 et le
+
;gistre de donnée = 50 et le
 
;registre de controle=%111
 
;registre de controle=%111
   
Line 298: Line 298:
   
   
; La routine sous interruption qui se contente d'incr‚menter le L-M
+
; La routine sous interruption qui se contente d'incrémenter le L-M
 
; en 'VAL'
 
; en 'VAL'
   
Line 312: Line 312:
   
 
LA DC.B 27,'E','Routine sous interruption (TIMER A )'
 
LA DC.B 27,'E','Routine sous interruption (TIMER A )'
DC.B ' qui incr‚mente le',13,10,'contenu de la va'
+
DC.B ' qui incrémente le',13,10,'contenu de la va'
DC.B 'riable affich‚e ([Q] pour QUITTER) ...',0
+
DC.B 'riable affichée ([Q] pour QUITTER) ...',0
   
 
BSS
 
BSS
Line 327: Line 327:
 
--------------------
 
--------------------
 
 
Voilà, les listings et les programmes ex‚cutables de ces exercices
+
Voilà, les listings et les programmes exécutables de ces exercices
 
se trouvent dans les fichiers:
 
se trouvent dans les fichiers:
   
Line 336: Line 336:
 
et PALETTE.PRG
 
et PALETTE.PRG
 
 
3) AFFICHE.L pour le programme d'affichage du L-M incr‚ment‚ sous
+
3) AFFICHE.L pour le programme d'affichage du L-M incrémenté sous
 
interruption.
 
interruption.
   

Latest revision as of 15:24, 17 December 2023

     
                             -----------------
                              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