source: Sophya/trunk/Poubelle/archediab.old/archediab.sources/c/timer.c@ 637

Last change on this file since 637 was 637, checked in by ansari, 26 years ago

archediab version 24 initial import

File size: 2.9 KB
RevLine 
[637]1#include <manip.h>
2#include "montimer.h"
3
4
5#ifndef powerc
6//$$#include <A4Stuff.h>
7#endif
8
9
10
11
12//Globals
13
14
15#ifndef powerc
16void montimer(void);
17#else
18void montimer(TMInfoPtr recPtr);
19#endif
20
21TMInfo myTMInfo;
22
23
24TMInfoPtr setuptimer(long delai,void (*execute)(void*),void * mastructure)
25{
26 TMInfoPtr myTMInfopt=malloc(sizeof(TMInfo));
27
28 //This statement will work with 68K or PPC
29
30 myTMInfopt->atmTask.tmAddr = NewTimerProc(montimer);
31 myTMInfopt->atmTask.qLink = NULL;
32 myTMInfopt->atmTask.qType = 0;
33 myTMInfopt->atmTask.tmCount = 0L;
34 myTMInfopt->atmTask.tmWakeUp = 0L;
35 myTMInfopt->atmTask.tmReserved = 0L;
36 myTMInfopt->mastructure = mastructure;
37 myTMInfopt->delai=delai;
38 myTMInfopt->execute=execute;
39
40
41#ifdef powerc
42 //You don't need to do anything. We will ignore the tmRefCon field.
43#else
44 //Store A4 into the TMInfo struct
45 //This is the best way in this situation
46//$$ myTMInfopt->tmRefCon = GetCurrentA4();
47 myTMInfopt->A5=SetCurrentA5();
48#endif //powerc
49
50 InsXTime((QElemPtr)myTMInfopt);
51 PrimeTime((QElemPtr)myTMInfopt, delai);
52return(myTMInfopt);
53}
54
55
56
57void supprimetimer(TMInfoPtr myTMInfopt)
58{
59if(myTMInfopt)
60 {
61 TimerUPP tt=myTMInfopt->atmTask.tmAddr;
62 DisposeRoutineDescriptor(tt);
63 RmvTime((QElemPtr)myTMInfopt);
64 free(myTMInfopt);
65 myTMInfopt=0;
66 }
67}
68
69
70
71void stoptimer(TMInfoPtr myTMInfopt)
72{
73if(myTMInfopt) myTMInfopt->delai=0;
74}
75
76void redemarretimer(TMInfoPtr myTMInfopt,long delai)
77{
78if(myTMInfopt)
79 {
80 myTMInfopt->delai=delai;
81 PrimeTime((QElemPtr)myTMInfopt,myTMInfopt->delai);
82 }
83}
84
85
86/*----------------- prog interruption -----------------------*/
87
88
89#ifndef powerc
90
91 //The 68K resource needs this glue to move the TMInfo pointer from A1 to A0 where
92 //the Toolbox put it. N.B. This is very different from the pascal glue provided in
93 //IM 6 TimeManager chapter, but then Pascal is very different from C.
94
95asm inline TMInfoPtr GetTMInfo( void )
96{
97 move.l A1, A0;
98 rts;
99}
100
101
102 //This function is being called at interrupt time so we can't move memory. All we can
103 // do is to set a global flag which our Drawing proc will detect.
104void montimer(void)
105{
106 //Get a pointer to our TMInfo so we can prime it again
107 TMInfoPtr recPtr = GetTMInfo();
108 long myDelay = 1000; //one sec.
109
110 //Sets A4 to the value in tmRefCon which was set to point to A4 at non-interrupt time.
111//$$ long oldA4 = SetA4(recPtr->tmRefCon);
112 long oldA5 = SetA5(recPtr->A5); /*A5 du programme*/
113
114 (recPtr->execute)(recPtr->mastructure);
115 PrimeTime((QElemPtr)recPtr,recPtr->delai);
116
117 //Restore the register state
118//$$ (void)SetA4(oldA4);
119 SetA5(oldA5); /*restore A5*/
120
121}
122
123
124
125#else
126
127 //The PowerPC version of a TimerUPP has the TMInfo pointer as a parameter. Whew! No glue.
128 //In fact, no need to set up global space either!
129void montimer(TMInfoPtr recPtr)
130{
131
132 (recPtr->execute)(recPtr->mastructure);
133 if(recPtr->delai) PrimeTime((QElemPtr)recPtr,recPtr->delai);
134
135}
136#endif //powerc
137
138
139
140
141
Note: See TracBrowser for help on using the repository browser.