title Control-Break handler for Lattice C programs name break include dos.mac;; Control-Break Interrupt Handler for Lattice C programs ; running on IBM PCs (and ROM BIOS compatibles); ; Ray Duncan, May 1985;; This module allows C programs running on the IBM PC; to retain control when the user enters a Control-Break; or Control-C. This is accomplished by taking over the; Int 23H (MS-DOS Control-Break) and Int 1BH (IBM PC ; ROM BIOS Keyboard Driver Control-Break) interrupt ; vectors. The interrupt handler sets an internal; flag (which must be declared STATIC INT) to TRUE within; the C program; the C program can poll or ignore this ; flag as it wishes.; ; The module follows the Lattice C parameter passing; conventions, and also relies on the Lattice file DOS.MAC; for the definition of certain constants and macros.;; The Int 23H Control-Break handler is a function of MS-DOS; and is present on all MS-DOS machines, however, the Int 1BH; handler is a function of the IBM PC ROM BIOS and will not; necessarily be present on other machines. ; if lprogargs equ 6 ;offset of arguments, Large models elseargs equ 4 ;offset of arguments, Small models endifcr equ 0dh ;ASCII carriage returnlf equ 0ah ;ASCII line feed pseg public capture,release ;function names for C;; The function CAPTURE is called by the C program to; take over the MS-DOS and keyboard driver Control-; Break interrupts (1BH and 23H). It is passed the; address of a flag within the C program which is set; to TRUE whenever a Control-Break or Control-C; is detected. The function is used in the form:; ; static int flag;; capture(&flag);capture proc near ;take over Control-Break push bp ;interrupt vectors mov bp,sp push ds mov ax,word ptr [bp+args] mov cs:flag,ax ;save address of integer mov cs:flag+2,ds ;flag variable in C program ;pick up original vector contents mov ax,3523h ;for interrupt 23H (MS-DOS int 21h ;Control-Break handler) mov cs:int23,bx mov cs:int23+2,es mov ax,351bh ;and interrupt 1BH int 21h ;(IBM PC ROM BIOS keyboard driver mov cs:int1b,bx ;Control-Break interrupt handler) mov cs:int1b+2,es push cs ;set address of new handler pop ds mov dx,offset ctrlbrk mov ax,02523H ;for interrupt 23H int 21h mov ax,0251bH ;and interrupt 1BH int 21h pop ds ;restore registers and pop bp ;return to C program retcapture endp;; The function RELEASE is called by the C program to; return the MS-DOS and keyboard driver Control-Break; interrupt vectors to their original state. Int 23h is; also automatically restored by MS-DOS upon the termination; of a process, however, calling RELEASE allows the C; program to restore the default action of a Control-C; without terminating. The function is used in the form:;; release();release proc near ;restore Control-Break interrupt ;vectors to their original state push bp mov bp,sp push ds mov dx,cs:int1b ;set interrupt 1BH mov ds,cs:int1b+2 ;(MS-DOS Control-Break mov ax,251bh ;interrupt handler) int 21h mov dx,cs:int23 ;set interrupt 23H mov ds,cs:int23+2 ;(IBM PC ROM BIOS keyboard driver mov ax,2523h ;Control-Break interrupt handler) int 21h pop ds ;restore registers and pop bp ;return to C program retrelease endp;; This is the actual interrupt handler which is called by; the ROM BIOS keyboard driver or by MS-DOS when a Control-C; or Control-Break is detected. Since the interrupt handler; may be called asynchronously by the keyboard driver, it; is severely restricted in what it may do without crashing; the system (e.g. no calls on DOS allowed). In this; version, it simply sets a flag within the C program to; TRUE to indicate that a Control-C or Control-Break has; been detected; the address of this flag was passed; by the C program during the call to the CAPTURE function.;ctrlbrk proc far ;Control-Break interrupt handler push bx ;save affected registers push ds mov bx,cs:flag ;set flag within C program mov ds,cs:flag+2 ;to "True" mov word ptr ds:[bx],-1 pop ds ;restore registers and exit pop bx iretctrlbrk endpflag dw 0,0 ;long address of C program's ;Control-Break detected flagint23 dw 0,0 ;original contents of MS-DOS ;Control-Break Interrupt 23H ;vector int1b dw 0,0 ;original contents of ROM BIOS ;keyboard driver Control-Break ;Interrupt 1BH vector endps end  
|