Listing 5

        /* delay for number of seconds requested */

        /* 2 MHz clock input                            */
        /*      divided by 100 (countdown value)        */
        /*      divided by 200 (prescaler value)        */
        /*      divided by 100 (time value multiplier)  */
        /* yields counter in increments of one second ! */

#include "mfp_defs.h"            /* MFP address definitions */
#include "mfp_macs.h"            /* MFP macro definitions */

#define COUNTDOWN     100        /* countdown value */
#define DIV_200         7        /* prescaler 200 indicator */
#define TIME_MULT     100        /* input time multiplier */
#define TIMER_B         0        /* timer B en/disable, bit 0 */

delay(seconds)
int seconds;
{
       extern long stimer;             /* global counter */

       stimer= (long)0;                /* zero the counter */

       REGVAL(TBDR) = COUNTDOWN;       /* init the down counter */
       REGVAL(TBCR) = DIV_200;         /* prescaler div 200 */
       BIT_SET(IERA,TIMER_B);          /* enable timer B interrupt */
       seconds = seconds * TIME_MULT;  /* scale the time value */

                                  /* loop until time expired */
       white (stimer < seconds)        /* (stimer is incremented by */
              ;                       /* an interrupt handler) */

       BIT_CLR(IERA,TIMER_B);          /* disable timer B interrupt */
       REGVAL(TBCR) = 0;               /* stop the timer */
}