/* EVENTS.C */ #include #include #include #include #include LOCAL_D VOID *timH; LOCAL_D WORD timstat; LOCAL_D WORD counter; LOCAL_D ULONG timint; LOCAL_D VOID *conH; LOCAL_D WORD keystat; LOCAL_D P_CON_KBREC key; #define MAX_COUNT 100 LOCAL_C VOID QueueKey(VOID) { p_ioa4(conH,P_FREAD,&keystat,&key); } LOCAL_C VOID QueueTimer(VOID) { p_ioa4(timH,P_FRELATIVE,&timstat,&timint); } LOCAL_C VOID CancelTimer(VOID) { p_iow2(timH,P_FCANCEL); p_waitstat(&timstat); } LOCAL_C VOID Check(INT val,TEXT *msg) { TEXT buf[30]; if (!val) return; p_atos(&buf[0],"Failed to open %s",msg); p_notifyerr(val,&buf[0],0,0,0); p_exit(0); } LOCAL_C VOID OpenTimer(VOID) { Check(p_open(&timH,"TIM:",-1),"timer"); } LOCAL_C VOID OpenConsole(VOID) { P_RECT rect; WORD func; Check(p_open(&conH,"CON:",-1),"console"); rect.tl.x=rect.tl.y=0; rect.br.x=25; rect.br.y=9; func=P_SCR_WSET; Check(p_iow4(conH,P_FSET,&func,&rect),"console"); } LOCAL_C VOID SetTimInt(INT new) { CancelTimer(); timint=new; QueueTimer(); } LOCAL_C VOID Write(INT x,INT y,TEXT *pb,INT len) { P_POINT pos; WORD func; pos.x=x; pos.y=y; func=P_SCR_POSA; p_iow4(conH,P_FSET,&func,&pos); p_write(conH,pb,len); } LOCAL_C VOID DisplayCount(VOID) { TEXT buf[4]; p_atos(&buf[0],"%3d",counter); Write(10,2,&buf[0],3); } LOCAL_C VOID DrawBorder(VOID) { TEXT buf[26]; INT i; p_bfil(&buf[0],26,'*'); Write(0,0,&buf[0],25); for (i=1; i<8; i++) { Write(0,i,&buf[0],1); Write(24,i,&buf[0],1); } Write(0,8,&buf[0],25); } GLDEF_C VOID main(VOID) { OpenConsole(); DrawBorder(); OpenTimer(); timint=10; QueueTimer(); QueueKey(); FOREVER { p_iowait(); if (keystat!=E_FILE_PENDING) { if (key.keycode==W_KEY_ESCAPE) p_exit(0); if (key.keycode>='1' && key.keycode<='9') SetTimInt(2*(key.keycode-'0')); QueueKey(); } else if (timstat!=E_FILE_PENDING) { if (counter++==MAX_COUNT) counter=1; DisplayCount(); QueueTimer(); } } }