#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 /* * 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;