Pl2 CORRIG 4.DOC/fr

From Atari Wiki
Revision as of 14:24, 17 December 2023 by Olivier.jan (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
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