Pl2 CORRIG 4.DOC/fr: Difference between revisions

From Atari Wiki
Jump to navigation Jump to search
m (Added category)
No edit summary
Line 354: Line 354:
 
</pre>
 
</pre>
 
Back to [[ASM_Tutorial]]
 
Back to [[ASM_Tutorial]]
[[Category:Programming]]
+
[[Category: ASSEMBLEUR 68000 sur ATARI ST Part 2]]

Revision as of 16:18, 12 October 2011

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