3 title CP
/DOS DosSetSigHandler mapper
7 dosxxx
segment byte public 'dos'
8 assume
cs:dosxxx
,ds:nothing
,es:nothing
,ss:nothing
10 ;**********************************************************************
12 ;* MODULE: dossetsighandler
14 ;* FILE NAME: dos007.asm
18 ;* push word file handle
19 ;* push dword distance
20 ;* push word move type
21 ;* push@ dword new pointer
24 ;* MODULES CALLED: PC-DOS Int 21h, ah=42h
26 ;*********************************************************************
28 public dossetsighandler
37 Signumber dw ?
; signal number
38 Action dw ?
; action code
39 Prevaction dd ?
; previous action code
40 Prevadrs dd ?
; previous vector address
41 Routineadrs dd ?
; interrupt handler address
44 ; While we hate to do this, we have to. The following data areas are
45 ; expected to be in the CODE segment.
47 NextControlBreakHandler
label dword
48 NextControlBreakHandlerOffset dw DummyControlBreakHandler
49 NextControlBreakHandlerSegment dw dosxxx
51 NextCriticalErrorHandler
label dword
52 NextCriticalErrorHandlerOffset dw DummyCriticalErrorHandler
53 NextCriticalErrorHandlerSegment dw dosxxx
55 dossetsighandler proc
far
57 Enter dossetsighandler
; push registers
59 mov ax,[bp].action
; get action code
60 cmp ax,2 ; action code 2 ??
61 je continue1
; branch if true
62 mov ax,1 ; else, set error code
66 mov ax,[bp].signumber
; get signel number
67 cmp ax,1 ; signal 1 (cntrl chara) ??
68 je cntrlc
; jump if true
69 cmp ax,4 ; signal 4 (cntrl chara) ??
70 je cntrlc
; jump if true
71 mov ax,2 ; else, set error code
75 int 21h
; get old vector address
77 lds si,[bp].prevadrs
; previous handler pointer
78 mov word ptr [si],bx ; save it in prevsdrs
79 mov word ptr [si]+2,es
81 lds dx,[bp].routineadrs
; get address of signal handler
83 mov NextControlBreakHandlerOffset
,dx ; save it
84 mov NextControlBreakHandlerSegment
,ds
88 mov dx,offset RealControlBreakHandler
91 int 21h
; set signal handler addrs in vector
93 sub ax,ax ; set good return code
95 exit: mexit
; pop registers
96 ret size
str - 6 ; return
102 ;------------------------------------------------------------------------------
104 ; This routine will get control on control break, and it will make
105 ; sure that the environment is acceptable prior to calling the new
106 ; handler. NOTE: we expect the new handler to be written in MicroSoft 'C'
108 RealControlBreakHandler proc
far
120 ; reestablish the es and ds segment registers before going to 'C'
126 call NextControlBreakHandler
140 RealControlBreakHandler endp
144 ;------------------------------------------------------------------------------
146 ; This routine will get control on the control break, and it will make
147 ; sure that the environment is acceptable prior to calling the new
148 ; handler. NOTE: we expect the new handler to be written in MicroSoft 'C'
150 RealCriticalErrorHandler proc
far
162 ; reestablish the es and ds segment registers before going to 'C'
168 call NextControlBreakHandler
182 RealCriticalErrorHandler endp
186 ;------------------------------------------------------------------------------
188 DummyControlBreakHandler proc
far
192 DummyControlBreakHandler endp
194 DummyCriticalErrorHandler proc
far
198 DummyCriticalErrorHandler endp