/*----------------------------------------------------------------*/ /* csleep.c Keven Miller 24 Apr 2011 kevenm@3kranger.com */ /* CCOPTS "-Aa +e +w1 +O2" */ /*----------------------------------------------------------------*/ #pragma list off #pragma LOCALITY "3kRanger" #include "cstd.h" #pragma intrinsic CCODE #pragma intrinsic PAUSE #pragma intrinsic RESETCONTROL #pragma intrinsic XCONTRAP extern void PAUSEX ( f32* ); #ifndef ORG static f32 sleep_time; static f32 unsleep_time; static s32 prev_cytrap; /*----------------------------------------------------------------*/ proc static void sleep_cytrap (void) { unsleep_time = sleep_time; sleep_time = 0.0; if ( prev_cytrap ) (*(vfp)prev_cytrap)(); RESETCONTROL (); } #endif /*----------------------------------------------------------------*/ proc u32 sleep ( u32 isecs ) { #ifdef ORG f32 f; f = isecs; PAUSE ( &f ); if ( MPE_CCE != CCODE () ) return isecs; else return 0; #else /* NEW */ XCONTRAP ( (int) &sleep_cytrap, &prev_cytrap ); sleep_time = isecs; unsleep_time = sleep_time; PAUSEX ( &sleep_time ); isecs = ( unsleep_time + 0.499999 ); XCONTRAP ( prev_cytrap, &prev_cytrap ); return isecs; #endif } /*----------------------------------------------------------------*/ #ifdef TEST #undef TEST #include /* printf */ extern u32 sleep ( u32 ); #pragma intrinsic TIMER /*----------------------------------------------------------------*/ proc int main ( int ac, char* av [] ) { int secs, uns; int t1, t2; secs = 10; t1 = TIMER (); printf ( "Start Timer %10d\n", t1 ); uns = sleep ( secs ); t2 = TIMER (); printf ( "Sleep Timer %10d : %5d (unslept %d)\n", t2, t2 - t1, uns ); } #endif /*----------------------------------------------------------------*/