home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 199.lha / GimmeLib / timer.c < prev    next >
C/C++ Source or Header  |  1988-12-27  |  3KB  |  131 lines

  1. /*
  2.  *  FILE: timer.c
  3.  *  Support routines for dealing with the timer device.
  4.  *
  5.  *  Public Domain, but keep my name in it as the original author.
  6.  *  31-Aug-88    Jan Sven Trabandt   first release version
  7.  *  31-Oct-88    Jan Sven Trabandt   most routines moved to timerstuff.c
  8.  *                      so that minimal routines need to be
  9.  *                      linked in when using stdstuff.c
  10.  */
  11.  
  12.  
  13. #define I_AM_TIMER
  14. #include "gimmelib/gimmefuncs.h"
  15.  
  16. extern struct Device *TimerBase;
  17.  
  18.  
  19. struct timerequest *accessTimer( unit, portptr )
  20.     ULONG        unit;
  21.     struct MsgPort  **portptr;
  22. {
  23.     struct MsgPort    *timerport = NULL;
  24.     struct timerequest    *tr;
  25.  
  26. #ifdef GIMME_WIMPY
  27.     if( unit != UNIT_VBLANK && unit != UNIT_MICROHZ ) {
  28.     return( NULL );
  29.     }
  30. #endif
  31.     if( portptr && *portptr ) {
  32.     timerport = *portptr;
  33.     } else {
  34.     timerport = CreatePort( NULL, 0L );
  35.     if( portptr ) {
  36.         *portptr = timerport;
  37.     }
  38.     }
  39.     if( !timerport ) {
  40.     return( NULL );
  41.     }
  42.     tr = CreateExtIO( timerport, (ULONG)sizeof(struct timerequest) );
  43.     if( !tr ) {
  44.     DeletePort( timerport );
  45.     } else {
  46.     if( OpenDevice(TIMERNAME, unit, tr, 0L) ) {
  47.         DeleteExtIO( tr, (ULONG)sizeof(struct timerequest) );
  48.         DeletePort( timerport );
  49.         return( NULL );
  50.     }
  51.     }
  52.     TimerBase = tr->tr_node.io_Device;
  53.     tr->tr_node.io_Message.mn_Node.ln_Type = NT_FREEMSG;
  54.     return( tr );
  55. } /* accessTimer */
  56.  
  57.  
  58. LONG releaseTimer( tr, saveport )
  59.     register struct timerequest *tr;
  60.     struct MsgPort  *saveport;
  61. {
  62.     struct MsgPort  *tport;
  63.     LONG        err;
  64.  
  65. #ifdef GIMME_WIMPY
  66.     if( !tr ) {
  67.     return( 0L );
  68.     }
  69. #endif
  70.     tport = tr->tr_node.io_Message.mn_ReplyPort;
  71.     if( tr->tr_node.io_Message.mn_Node.ln_Type == NT_MESSAGE ) {
  72.     if( err = AbortIO(tr) ) {
  73.         return( err );
  74.     }
  75.     Remove( tr );
  76.     }
  77.     CloseDevice( tr );
  78.     DeleteExtIO( tr, (ULONG)sizeof(struct timerequest) );
  79.     if( !saveport && tport ) {
  80.     DeletePort( tport );
  81.     }
  82.     return( 0L );
  83. } /* releaseTimer */
  84.  
  85.  
  86. struct timerequest *gimmeTimeRequest( trmaster )
  87.     struct timerequest    *trmaster;
  88. {
  89.     register struct timerequest *tr;
  90.  
  91. #ifdef GIMME_WIMPY
  92.     if( !trmaster ) {
  93.     return( NULL );
  94.     }
  95. #endif
  96.     tr = CreateExtIO( trmaster->tr_node.io_Message.mn_ReplyPort,
  97.             (ULONG)sizeof(struct timerequest) );
  98.     if( tr ) {
  99.     tr->tr_node.io_Device = trmaster->tr_node.io_Device;
  100.     tr->tr_node.io_Unit   = trmaster->tr_node.io_Unit;
  101.     tr->tr_node.io_Message.mn_Node.ln_Type = NT_FREEMSG;
  102.     }
  103.     return( tr );
  104. } /* gimmeTimeRequest */
  105.  
  106.  
  107. LONG getRidOfTimeRequest( tr )
  108.     register struct timerequest *tr;
  109. {
  110.     LONG    err;
  111.  
  112. #ifdef GIMME_WIMPY
  113.     if( !tr ) {
  114.     return( 0L );
  115.     }
  116. #endif
  117.     Forbid();
  118.     tr->tr_node.io_Message.mn_ReplyPort = NULL;
  119.     if( tr->tr_node.io_Message.mn_Node.ln_Type == NT_MESSAGE ) {
  120.     if( err = AbortIO(tr) ) {
  121.         Permit();
  122.         return( err );
  123.     }
  124.     Remove( tr );
  125.     tr->tr_node.io_Message.mn_Node.ln_Type = NT_FREEMSG;
  126.     }
  127.     Permit();
  128.     DeleteExtIO( tr, (ULONG)sizeof(struct timerequest) );
  129.     return( 0L );
  130. } /* getRidOfTimeRequest */
  131.