Listing 8 (interupt.c)

/************************************************************
 * NAME :         Interupt.c
 * DESCRIPTION :  Interrupt routines for the preset controller
 ************************************************************/

/************************************************************
 *
 * NAM        : rcv_msg
 * DESCRIPTION: called by the interrupt routine which is
 *              invoked by uart interrupt bit.
 * COMPATIBLE LANGUAGES: <Assembler only>
************************************************************/
#include "serial.h"
#include "que.h"

extern  TRCSR;
extern  TDR;
extern  xstatus;
extern  struct g_queue xmit_que;
extern  struct g_queue in_que;
extern  RDR;
rcv_msg()
{
  unsigned char xstatus, temp;
  unsigned int remove, insert;
  
  xstatus = TRCSR;
  if (xstatus & RDRF)    /* did we receive something? */
  {
     temp = RDR;
     remove = in_que.remove;
     insert = in_que. insert;
     if ((insert+1!=remove) && (insert-remove!=kqlength-1))
     {                                     /* queue is full */
        in_que.que[insert++] = temp;
        if (insert == kqlength)
           insert = 0;
        in_que.insert = insert;
        in_que.empty = false;
     }
  }
  if (xstatus & TDRE)
  {                         /* do we have something to send? */
     if(xmit_que.empty == false)
     {
        remove = xmit_que.remove;
        TDR = xmit_que.que[remove++];
        if (remove == kqlength)
           remove = 0;
        xmit_que.remove = remove;
        if (remove == xmit_que.insert)
           xmit_que.empty = true;
     }
     else
     {
        /* turn off the interupt for transmit buffer empty and
           turn off the serial transmit buffer */
        TRCSR &= ~TIE;
     }
  }
}

/************************************************************
 *
 * NAME       : counter_irq
 *
 * DESCRIPTION:  called by the interrupt routine which is
 *               invoked by global timer interrupt - increments
 *               the global value of time and reads the keyboard.
 *************************************************************/

extern enable_timer;
extern globaltime;
extern flashtime;
extern dspy;
extern disable_on;
extern keyboard_port;
extern P1DR;
extern pad_read;

counter_irq()
{
   unsigned char i,line;
   static unsigned char keyport;
   unsigned int temp;
   
   /* clear the TOF bit in the timer control & status reg.
    * AND then clear the interupt mask in the condition code reg.
    */
   ;
#asm
   XREF TCSR?
   LDD TCSR?

   CLI
#endasm
   
   /* increment the global timer variable */
   if (enable_timer) globaltime += 1;
   
   /* increment the flash time */
   flashtime += 1;
   
   /* refresh the display */
   show(dspy);
   
   /* if (!disable_on) then read the keypad */
   if (!disable_on)
   {
      line = 0x8;
      for (i=0; i<4; i++)
      {
         P1DR = line;
         line >>= 1;
         keyport = P1DR;
         if (keyport & 0xf0)
            break;
      }
      if (i==0)
         keyboard_port = (keyport & 0xf0) | 1;
      else if (i==1)
         keyboard_port = (keyport & 0xf0) | 2;
      else if (i==2)
         keyboard_port = (keyport & 0xf0) | 4;
      else if (i==3)
         keyboard_port = (keyport & 0xf0) | 8;
      pad_read = true;
   }
}