#pragma option -zCISR_CODE	/* CODE segment */
#pragma option -zPISR_GROUP	/* CODE group */
#pragma option -zAISR		/* CODE class */

#pragma option -zRISR_DATA	/* DATA segment */
#pragma option -zSISR_GROUP	/* DATA group */
#pragma option -zTISR		/* DATA class */

#pragma option -zDISR_BSS	/* BSS segment */
#pragma option -zGISR_GROUP	/* BSS group */
#pragma option -zBISR		/* BSS class */

#pragma option -k-	/* Non-standard stack frame */
#pragma option -N-	/* Stack checking OFF */

#pragma option -O1      /* Generate the smallest code possible */

#include <dos.h>

/*
 * We assume everything is going to be allocated in this order:
 *
 *	CODE: isr
 *	DATA: old_isr
 *	      screen_seg
 *	BSS:  end_isr
 *
 * Note: this is only dependent on segment ordering, not on objects
 *	 within segments.
 *
 */

void interrupt (*old_isr)(void) = 0;

unsigned short _seg *screen_seg = 0;

#define SCREEN_SEG (*(short _seg * _cs *)(FP_OFF(&screen_seg)))
#define OLD_ISR (*(void interrupt (* _cs *)(void))(FP_OFF(&old_isr)))

void interrupt
isr(void) {
#if 0
	unsigned short c;

	c = 0x0f00 | '*';
	if (*(unsigned char far *)MK_FP(0x40, 0x97) & 0x04) {
		c = 0x0f00 | '-';
	}
	SCREEN_SEG[79] = c;
#else
	SCREEN_SEG[79] = (0x0ffa
			  + (*(unsigned short far *) MK_FP(0x40, 0x97)
			     & 0x04));
#endif
	OLD_ISR();
}


char end_isr;