[comp.lang.c] Interrupt Handlers in C

bright@Data-IO.COM (Walter Bright) (07/13/89)

In article <3607@cps3xx.UUCP> usenet@cps3xx.UUCP (Usenet file owner) writes:
>Below is a short piece of code written for Microsoft C 5.1 which illustrates
>how easy it is to  write interrupt routines in C, despite what the other
>poster said.
>I must admit that I have not had the opportunity to use Turbo C or
>Zortech C.

I couldn't resist the challenge. I wrote a Zortech C version.
Compare for yourselves.

---------- ZTC --------------------
/* To compile test program:
 *	ZTC int -D
 */

#include <int.h>

static unsigned int ticker = 0;

#define timeup() (ticker==0)
#define timerset(tenths) ticker=(unsigned int)((long)tenths*182L/100L+1L)
#define TIMER     0x1c

static int newtimer(struct INT_DATA *pd)
    {
    if (ticker)
        --ticker;
    return 0;      /* call old timer ISR */
    }

void sleep(int seconds)
	{
	int_intercept(TIMER,newtimer,256);
	when = timerset (seconds * 10);
	while (!timeup())
	    ;
	int_restore(TIMER);
	}

#if DEBUG
#include <stdio.h>
main()
    {
    char input[100];
    int val;
    long when;
    
    printf ("Enter delay amount in 1/10 seconds: ");
    gets (input);
    val = atoi (input);

    int_intercept(TIMER,newtimer,256);
    when = timerset (val);
    while (!timeup())
        ;
    int_restore(TIMER);
    }
#endif

------------ MSC ------------------
#include <stdio.h>
#include <dos.h>

static void intercept_timer(void);
static void restore_timer(void);
static void interrupt far newtimer (void);
static void (interrupt far *oldtimer)(void);
static unsigned int ticker = 0;

#define timeup() (ticker==0)
#define timerset(tenths) ticker=(unsigned int)((long)tenths*182L/100L+1L)
#define TIMER     0x1c

#define getvect _dos_getvect
#define setvect _dos_setvect

static void intercept_timer (void)
    {
    if (oldtimer == NULL)
        {
        oldtimer = getvect(TIMER);
        setvect (TIMER, newtimer);
        }
    }

static void restore_timer(void)
    {
    if (oldtimer)
        setvect(TIMER, oldtimer);
    oldtimer = NULL;
    }

static void interrupt far newtimer()
    {
    (*oldtimer)();      /* call old timer ISR */
    if (ticker)
        --ticker;
    }

void sleep(int seconds)
	{
	intercept_timer ();
	timerset (seconds * 10);
	while ( ! timeup())
		;
	restore_timer ();
	}



#if DEBUG
#include <stdio.h>
main()
    {
    char input[100];
    int val;
    long when;
    
    printf ("Enter delay amount in 1/10 seconds: ");
    gets (input);
    val = atoi (input);

    intercept_timer();
    when = timerset (val);
    while (!timeup (when))
        ;
    restore_timer();
    }
#endif
---------------------------------