Pl2 INTER 2.DOC

From Atari Wiki
Revision as of 14:19, 17 December 2023 by Olivier.jan (talk | contribs) (Replacing content of with translated version)
Jump to navigation Jump to search

continuation on INTERRUPTS ...



14) TBCR: Identical to TACR, except this register controls TIMER B

          ($FFFA1B)


15) TCDCR: Bit vector serving the same role as TACR and TBCR for

          TIMER C and TIMER D, but here only the DELAY MODE is
          available.
          ($FFFA1D)
          Bits 0 to 2 are reserved for TIMER C
          Bits 4 to 6 are reserved for TIMER D
          Refer to the TACR table for the meaning of the bits...
          I remind you that we will not use these TIMERS because
          they are already used by the system originally.

16) to 19) TADR, TBDR, TCDR, TDDR (starting from $FFFA1F):

      Here are the DATA registers of the 4 TIMERS ...

20) to 24) SRC,CR,RSR,TSR,DR (starting from $AFFF27):

      Registers that are not used by the TIMERS, and they
      simply control the transmission of characters...



Now that you are familiar with the various registers of the MFP 68901, you will be able to start creating your first programs with interrupts.

To modify a register of the MFP, it is enough to know the address of the register and to deposit the necessary data there.

- Here's how to proceed to put a routine under

 interrupt:
 

  • We switch to SUPERVISOR MODE to be able to access the MFP registers.
  • We set to 0 the bit corresponding to the TIMER used in the IMR register.
 (With an AND #BBB, destination or a BCLR #BBB, destination)
  • We set to 0 the bit corresponding to the TIMER used in the ISR register.
  • We set to 0 the bit corresponding to the TIMER used in the IPR register.
  • We set to 0 the bit corresponding to the TIMER used in the IER register.
  • We install our routine:
  .Either by depositing the address of our routine directly in the
   EXCEPTION VECTOR corresponding to the used TIMER:
   $134 for TIMER A, $120 for TIMER B, $114 for TIMER C,
   $110 for TIMER D (with MOVE.L #ADDRESS,$vector)
   (See the Table of exception vectors)
   Then by modifying directly the CONTROL and DATA REGISTERS
   of the TIMER by depositing the new values at their addresses.
   (With MOVE.B #VALUE,$address) 
   (Refer to the addresses of the CONTROL REGISTERS TACR,TBCR,TCDCR and the
   addresses of the DATA REGISTERS TADR,TBDR,TCDR,TDDR)
   
   
  .Or by calling an XBIOS function that does it for us:
   This is the XBTIMER function of the XBIOS.
   The parameters to pass are:
   L-M: Address of the routine    
   WORD: Value of the DATA register
   WORD: Value of the CONTROL register
   WORD: The code of the TIMER (0=TIMER A,1=TIMER B,2=TIMER C,3=TIMER D)
   WORD: Code of the function = $1F
   
  We will still need to:
 .Set to 1 the bit of the IER register corresponding to our TIMER (To
  enable our interrupt routine)
 .Set to 1 the bit of the IMR register corresponding to our TIMER
  

  And there, my routine is installed !!!


  The routine itself:
  ---------------------
  The routine to be placed under interrupt must be able to execute
  fully before the next TIMER call because otherwise beware
  of crashes!!
  It should therefore not be too long:
  For example, you cannot put a routine that takes 0.5 
  seconds to execute fully under interrupt and set
  its call frequency at 0.007 seconds...

  Your interrupt routine should always end with:
   .A reset to 0 of the bit corresponding to the TIMER used in the ISR register
    ,to indicate to the MFP that the routine is finished.
              --------------------------------
    With      BCLR #5,$FFFA07 for TIMER A        (On ISRA)
    or        BCLR #0,$FFFA11 for TIMER B        (On ISRB)
              --------------------------------
   .An RTE (Return From Exception)  
       ---
 
 Furthermore, since your routine executes at regular intervals, I strongly
 advise against using DN or AN registers (even SP) because
 this can cause sudden changes at the level of the registers
 concerned in the main program. (The interrupt subroutine
 executes without interrupting the main program, we will see
 a very good illustration of this in a future exercise)
 However, the interrupt subroutine can call addresses of the DATA or BSS segment to read or deposit values...


 That's it for the theory, I strongly advise you to reread the whole
 chapter thoroughly because now come the EXERCISES ...


                             -----------------
 Laurent PIECHOCKI
 8, Impasse Bellevue            Continuation in the file: EXOS_4.DOC 
 57980 TENTELING                                     ----------




Back to ASM_Tutorial