[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
|
---|
| 16 | void montimer(void);
|
---|
| 17 | #else
|
---|
| 18 | void montimer(TMInfoPtr recPtr);
|
---|
| 19 | #endif
|
---|
| 20 |
|
---|
| 21 | TMInfo myTMInfo;
|
---|
| 22 |
|
---|
| 23 |
|
---|
| 24 | TMInfoPtr 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);
|
---|
| 52 | return(myTMInfopt);
|
---|
| 53 | }
|
---|
| 54 |
|
---|
| 55 |
|
---|
| 56 |
|
---|
| 57 | void supprimetimer(TMInfoPtr myTMInfopt)
|
---|
| 58 | {
|
---|
| 59 | if(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 |
|
---|
| 71 | void stoptimer(TMInfoPtr myTMInfopt)
|
---|
| 72 | {
|
---|
| 73 | if(myTMInfopt) myTMInfopt->delai=0;
|
---|
| 74 | }
|
---|
| 75 |
|
---|
| 76 | void redemarretimer(TMInfoPtr myTMInfopt,long delai)
|
---|
| 77 | {
|
---|
| 78 | if(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 |
|
---|
| 95 | asm 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.
|
---|
| 104 | void 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!
|
---|
| 129 | void 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 |
|
---|