汇编源码系列之break

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究.......

    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   lprog
args  equ   6        ;offset of arguments, Large models
    else
args  equ   4        ;offset of arguments, Small models
    endif
cr   equ   0dh       ;ASCII carriage return
lf   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
    ret
capture 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
    ret
release 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
    iret
ctrlbrk endp
flag  dw   0,0       ;long address of C program's
                ;Control-Break detected flag
int23  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

时间: 2024-09-15 17:13:18

汇编源码系列之break的相关文章

汇编源码系列之brk2

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... TITLE BRK2 -- Break Handling Utilities ModuleTRUE EQU 01H ;boolean trueFALSE EQU 00H ;boolean falseBREAKINT EQU 23H ;dos control-break intrptGETVECTOR EQU 35H ;dos get ve

汇编源码系列之dossym

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... include DOSMAC.ASMIF2%OUT DOSSYM in Pass 2ENDIF IFNDEF ALTVECTALTVECT EQU 0 ;FALSEENDIF BREAK <Control character definitions> c_DEL EQU 7Fh ; ASCII rubout or delete prev

汇编源码系列之dosmac

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... ;; Macro file for MSDOS.;SUBTTL BREAK a listing into pages and give new subtitlesPAGEBREAK MACRO subtitle SUBTTL subtitle PAGEENDMBREAK <I_NEED: declare a variable extern

汇编源码系列之clear

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... name clear page 55,132 title 'CLEAR --- control PC display';; CLEAR Utility to clear display; and set character attributes;; Ray Duncan, Uncopyright (u) August 1983; This

汇编源码系列之clock

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... CGROUP GROUP VECTOR,CODESEGVECTOR SEGMENT AT 0H DB 6CH DUP(?) ;FILLERTIME_LO DW ? ;DOS TIMETIME_HI DW ? ;DOS TIMEVEC_IP DW ;CLOCK UPDATE VECTOR IPVEC_CS DW ;CLOCK UPDATE

汇编源码系列之charop

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... title MSDOS 2.00 Function Library for Lattice Csubttl -;;;;FUNCTION: Sets and returns switch char-;; acter and device availability.;;;;;;CALL:;;;; ret= _charop(al,dl);; i

汇编源码系列之clean

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... name clean page 55,132 title 'CLEAN --- Filter text file';; CLEAN --- a utility to filter text files.; This program removes all control codes except; for line feeds, carr

汇编源码系列之cleanf

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... name cleanf page 55,132 title 'CLEANF - Filter text file';; CLEANF - a DOS 2.0 filter for word processing document files.;; CLEAN.ASM Originally written by Ray Duncan; Co

汇编源码系列之burnout

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... COMMENT * Demo (and semi-useful) program to read/set burnout device parameters. Usage: burnout [ticks] [C+-] [V+-] [H+-] Parameters can be separated by almost anything. W