-----------------
CORRECTIONS of
EXERCISES NR°4
-----------------
1) Exercise nr°1:
--------------
a) If TACR is worth %100 and the data register is worth 42, what will be
the call frequency of a program on this TIMER?
With TACR = %100, we have a prescaler of 50, the data register
is worth 42, so we get:
frequency = 245760 / 50 / 42 = about 117 calls per second (Delay Mode)
Will the program be installed on TIMER A or TIMER B?
TACR manages the operating mode of TIMER A. (have you forgotten
already ?)
b) How to stop a program under interruption installed
on TIMER A ? :
It is enough to set the first 4 bits of the TACR register to 0
c) We want to install a program under interruption that must execute
about 245 times per second, give a possible value of the control
and data registers to achieve this effect.
If the control register is worth %10, we have a prescaler of 10 and
if the data register also worth 10, we get:
frequency = 245760 / 10 / 10 = 245.76 calls per second (Delay Mode)
d) Can we install several programs under interruption in the
same TIMER?
Of course NOT!
Just look at how to install a routine
on a TIMER, the first thing we do is set all the
registers of the concerned TIMER to 0 to disable the routine that
was already there....
e) A program under interruption must necessarily execute in
SUPERVISOR MODE.
Find a reason for this ...
A simple reason is that at the end of the program (Before the RTE),
we clear the concerned bit of the ISR register.
And any modification of the MFP registries SHOULD be done in SUPERVISOR
MODE...
1) Exercise nr°2:
--------------
Here are the macros for TIMERS A and B:
TIMERA MACRO $\1,$\2,$\3 ;MACRO with 3 parameters
; Zeroing the different bit vectors for TIMER A
and.b #%11011111,$FFFA13 ;IMRA
and.b #%11011111,$FFFA0F ;ISRA
and.b #%11011111,$FFFA0B ;IPRA
and.b #%11011111,$FFFA07 ;IERA
; XBTIMER and installing our routine
pea \1 ;\1=LABEL of the start of the routine
; to put under interruption
move.w #\2,-(sp) ;\2=control register
move.w #\3,-(sp) ;\3=data register
move.w #0,-(sp) ;0 =TIMER A
move.w #$1F,-(sp) ;XBTIMER
trap #14 ;XBIOS
adda.l #12,sp ;we reposition SP
; Setting to 1 the different bit vectors for TIMER A
or.b #%100000,$FFFA07 ;IERA
or.b #%100000,$FFFA13 ;IMRA
ENDM ;End of the macro
TIMERB MACRO $\1,$\2,$\3 ;MACRO with 3 parameters
; Zeroing the different bit vectors for TIMER B
and.b #%11111110,$FFFA13 ;IMRB
and.b #%11111110,$FFFA0F ;ISRB
and.b #%11111110,$FFFA0B ;IPRB
and.b #%11111110,$FFFA07 ;IERA
; XBTIMER and installing the routine on TIMER B
pea \1 ;\1=LABEL of the start of the routine
; to put under interruption
move.w #\2,-(sp) ;\2=control register
move.w #\3,-(sp) ;\3=data register
move.w #1,-(sp) ;1 = TIMER B
move.w #$1F,-(sp) ;XBTIMER
trap #14 ;XBIOS
adda.l #12,sp ;we reposition SP
; Setting to 1 the different bit vectors
or.b #%1,$FFFA07 ;IERB
or.b #%1,$FFFA13 ;IMRB
ENDM ;END of the MACRO
2) Exercise nr°3:
--------------
Two solutions exist to stop TIMERS A and B.
The first consists of setting the first 4 bits of the TACR registers
(For TIMER A) or TBCR (For TIMER B) to 0.
So we would write:
BCLR #0,$FFFA19 ;bit 0 of the TACR register
BCLR #1,$FFFA19 ;bit 1
BCLR #2,$FFFA19 ;bit 2
BCLR #3,$FFFA19 ;bit 3
For TIMER A (In SUPERVISOR MODE!)
Or
BCLR #0,$FFFA1B ;bit 0 of the TBCR register
BCLR #1,$FFFA1B ;bit 1
BCLR #2,$FFFA1B ;bit 2
BCLR #3,$FFFA1B ;bit 3
For TIMER B (In SUPERVISOR MODE!)
There is also an XBIOS function that allows to block an
interruption of the MFP 68901: It is the JDISINT function of code 26.
We just need to pass the IPL of the MFP that must be stopped.
It is with this function that we will create our MACROS:
For TIMER A (Level 13/6 in the MFP), we will write:
STOPTIMEA MACRO
move.w #13,-(sp) ;TIMER A ( IPL 13/6)
move.w #26,-(sp) ;JDISINT
trap #14 ;XBIOS
addq.l #4,sp ;we reposition SP
ENDM
For TIMER B (Level 8/6 in the MFP), we will write:
STOPTIMEB MACRO
move.w #8,-(sp) ;TIMER B ( IPL 8/6 )
move.w #26,-(sp) ;JDISINT
trap #14 ;XBIOS
addq.l #4,sp ;we reposition SP
ENDM
3) Exercise nr°3:
--------------
Here is the listing of the program that varies the palette of colors
under interruption.
There was no difficulty.
TEXT
INCLUDE "INIT_TOS.L" ;Setblock
INCLUDE "MACROS.L" ;The MACROS
INCLUDE "TIMERS.L" ;The file of MACROS
;for the TIMERS
SETBLOCK ;initialisation
SUPER ;SUPERVISOR MODE
PRINTLINE CA ;text
WAIT ;wait
TIMERA ROUTINE,200,%111 ;We install the routine
;on TIMER A with the
;data register=200
;and control register
;=%111
USER ;USER MODE for
KEEP 2000 ;return to DESKTOP with the program
; The routine under interruption that changes the colors:
ROUTINE cmpi #30,TESTE ;Do we have 30 in 'TESTE'?
bgt DEUX ;If it's greater, go to 'DEUX'
move.l #PAL1,$45A ;Address of the new palette in
;'colorptr'
add #1,TESTE ;Otherwise add 1 to 'TESTE'
bclr #5,$FFFA0F ;Clear ISRA (bit 5=TIMER A)
RTE ;RETURN FROM EXCEPTION
DEUX move.l #PAL2,$45A ;Address of the new palette in
;'colorptr'
add #1,TESTE ;Add 1 to 'TESTE'
cmpi #60,TESTE ;Do we have 60 in 'TESTE' ?
bne NON ;If NO, go to 'NON'
move #0,TESTE ;Set 0 in 'TESTE'
NON bclr #5,$FFFA0F ;Clear ISRA (bit 5=TIMER A)
RTE ;RETURN FROM EXCEPTION
DATA
; Palette nr° 1
PAL1 DC.W $777,$700,$070,$000,$000,$777,$777,$777
DC.W $777,$777,$777,$777,$777,$777,$777,$777
; 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 under interruption (TIMER A )'
DC.B ' that changes the',13,10,'color nr°3 of the'
DC.B ' palette (System Variable $45A):',0
BSS
DS.B 500
PILE DS.B 1 ;For SETBLOCK
SAUV_SP DS.L 1 ;For SUPER and USER
TESTE DS.W 1 ;For the routine under interruption
END
4) Exercise nr°4:
--------------
Here too, no major difficulty...
TEXT
INCLUDE "INIT_TOS.L" ;SETBLOCK
INCLUDE "MACROS.L" ;The MACROS
INCLUDE "TIMERS.L" ;The TIMERS MACROS
INCLUDE "MACROS_2.L" ;The MACRO HEXA
SETBLOCK ;initialisation
SUPER ;SUPERVISOR MODE
PRINTLINE LA ;text
CCONOUT #13 ;13 +
CCONOUT #10 ;10 = return to the line at
;column 1
WAIT ;wait
TIMERA PRG,50,%111 ;We install our routine
;on TIMER A with the da-
;ta register = 50 and the
;control register=%111
; The loop that displays the values of the variable
BOUCLE HEXA VAL ;Displays the L-M of 'VAL' in HEXA
CCONOUT #13 ;13 +
CCONOUT #10 ;10 = return to the line at column 1
WAIT ;wait
cmpi.b #'Q',d0 ;Key = Q?
beq RETOUR ;If YES, go to 'RETOUR'
cmpi.b #'q',d0 ;Key = q?
beq RETOUR ;If YES, go to 'RETOUR'
jmp BOUCLE and we start again with 'BOUCLE'
; The routine under interruption that just increments the L-M
; in 'VAL'
PRG add.l #1,VAL ;Add 1 to the L-M in 'VAL'
bclr #5,$FFFA0F ;Clear ISRA (bit 5=TIMER A)
RTE ;RETURN FROM EXCEPTION
RETOUR USER ;USER MODE
STOPTIMEA ;we stop TIMER A
TERM ;and END!
DATA
LA DC.B 27,'E','Routine under interruption (TIMER A )'
DC.B ' that increments the',13,10,'content of the di'
DC.B 'splayed variable ([Q] to QUIT) ...',0
BSS
DS.B 500
PILE DS.B 1 ;For SETBLOCK
SAUV_SP DS.L 1 ;For SUPER and USER
VAL DS.L 1 ;The variable to display
END
--------------------
Well, the listings and the executable programs of these exercises
can be found in the files:
1) TIMERS .L for the MACROS TIMERA,TIMERB,STOPTIMEA,STOPTIMEB
2) PALETTE.L for the program of changing the palette under
interruption.
and PALETTE.PRG
3) AFFICHE.L for the program that displays the L-M incremented under
interruption.
and AFFICHE.PRG
PIECHOCKI Laurent
8, Impasse Bellevue Continued in the file:ANNEXE.DOC
57980 TENTELING ----------