/*
 * 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 );
}

