Listing 3 REAL_ISR.C — the real-mode interrupt service routine, as well as the Port data structure.

/*
 * REAL_ISR.C Copyright (C) 1992 Mark R. Nelson.
 *
 * This header file contains the source code for the real
 * time interrupt service routine used in the TERM286.H
 * program. It also contains the only copy of the data
 * structure used to access the UART.
 */

#include <dos.h>
#include <conio.h>
#include "phapi.h"
#include "term286.h"

/*
 * This is the data structure used by both the real and
 * protected mode interrupt service routines.
 */
struct port_data Port;

/*
 * This is the real mode ISR. It is identical to the
 * protected mode ISR, except for the increment of the
 * real mode interrupt count near the end. This routine
 * reads in the character that caused the interrupt, then
 * tries to stuff it in the buffer and update the head
 * pointer. Finally, it increments the diagnostic
 * counter, outputs an EOI to the 8259 PIC, and exits.
 */

void far interrupt real_isr()
{
   unsigned char c;
   int space_used;

   c = ( unsigned char ) inp( Port.uart_address );
   space_used = Port.head_pointer - Port.tail_pointer;
   if ( space_used < 0 )
      space_used += 1024;
   if ( space_used < 1023 ) {
      Port.buffer[ Port.head_pointer++ ] = c;
      Port.head_pointer &= 1023;
   }
   Port.real_count++;
   (void) outp( 0x20, 0x20 );
}
/* End of File */