Pl2 INTER 2.DOC: Difference between revisions

From Atari Wiki
Jump to navigation Jump to search
(Olivier.jan moved page Pl2 INTER 2.DOC to Pl2 INTER 2.DOC/fr: Renaming for language version)
Tag: New redirect
 
(Replacing content of with translated version)
Tag: Removed redirect
Line 1: Line 1:
  +
continuation on INTERRUPTS ...
#REDIRECT [[Pl2 INTER 2.DOC/fr]]
 
  +
---------------------------
  +
  +
  +
  +
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]]
  +
[[Category: ASSEMBLER 68000 on ATARI ST Part 2]]

Revision as of 15:19, 17 December 2023

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