/************************************************************************* ** File: timer.c ** contains timer routines ** ** Functions: ** open_time() - initializes and opens timer device ** close_time() - clean up and close timer device ** start_timer() - issue an asynchronous timer request ** kill_timer() - cancel an outstanding asynch timer request ** test_timer() - test for a timer pop ** Delay() - cause task to sleep (synchronous timer request) ** *************************************************************************/ #include "term.h" struct timerequest *timer; /* for timer request */ static long interval; extern int timeout; open_time() { struct MsgPort *myport; if (!(myport = (struct MsgPort *)CreatePort("term.timer",0))) { emits("\nUnable to create time port\n"); return(FALSE); } timer = (struct timerequest *) AllocMem(sizeof(struct timerequest),MEMF_CLEAR | MEMF_PUBLIC); if (!timer) { emits("\nUnable to allocate time request\n"); DeletePort(myport); return(FALSE); } timer->tr_node.io_Message.mn_Node.ln_Type = NT_MESSAGE; timer->tr_node.io_Message.mn_Node.ln_Pri = 0; timer->tr_node.io_Message.mn_ReplyPort = myport; if (OpenDevice(TIMERNAME,UNIT_VBLANK,timer,0)) { emits("\nUnable to open Timer Device\n"); DeletePort(myport); FreeMem(timer,sizeof(struct timerequest)); return(FALSE); } return(TRUE); } close_time() { CloseDevice(timer); DeletePort(timer->tr_node.io_Message.mn_ReplyPort); timer->tr_node.io_Message.mn_Node.ln_Type = 0xff; timer->tr_node.io_Device = (struct Device *) -1; timer->tr_node.io_Unit = (struct Unit *) -1; FreeMem(timer,sizeof(struct timerequest)); } start_timer(itvl) int itvl; { timeout = FALSE; timer->tr_time.tv_secs = itvl; timer->tr_time.tv_micro = 0; timer->tr_node.io_Command = TR_ADDREQUEST; SendIO(timer); } kill_timer() { AbortIO(timer); GetMsg(timer->tr_node.io_Message.mn_ReplyPort); } test_timer() { return(CheckIO(timer) && (!timer->tr_node.io_Error)); } Delay(N) /** * Delay for N seconds **/ int N; { start_timer(N); Wait(1 << timer->tr_node.io_Message.mn_ReplyPort->mp_SigBit) ; GetMsg(timer->tr_node.io_Message.mn_ReplyPort) ; }