home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / dos_ency / 12 / int24.asm < prev    next >
Encoding:
Assembly Source File  |  1988-08-11  |  3.9 KB  |  130 lines

  1.         name    int24
  2.         title   INT24 Critical Error Handler
  3.  
  4. ;
  5. ; INT24.ASM -- Replacement critical error handler
  6. ; by Ray Duncan, September 1987
  7. ;
  8.  
  9. cr      equ     0dh             ; ASCII carriage return
  10. lf      equ     0ah             ; ASCII linefeed
  11.  
  12. DGROUP  group   _DATA
  13.  
  14. _DATA   segment word public 'DATA'
  15.  
  16. save24  dd      0               ; previous contents of Int 24H
  17.                                 ; critical error handler vector
  18.  
  19.                                 ; prompt message used by
  20.                                 ; critical error handler
  21. prompt  db      cr,lf,'Critical Error Occurred: '
  22.         db      'Abort, Retry, Ignore, Fail? $'
  23.  
  24. keys    db      'aArRiIfF'      ; possible user response keys
  25. keys_len equ    $-keys          ; (both cases of each allowed)
  26.  
  27. codes   db      2,2,1,1,0,0,3,3 ; codes returned to MS-DOS kernel
  28.                                 ; for corresponding response keys
  29.  
  30. _DATA   ends
  31.  
  32.  
  33. _TEXT   segment word public 'CODE'
  34.  
  35.         assume  cs:_TEXT,ds:DGROUP
  36.  
  37.         public  get24           
  38. get24   proc    near            ; set Int 24H vector to point
  39.                                 ; to new critical error handler
  40.  
  41.         push    ds              ; save segment registers
  42.         push    es
  43.  
  44.         mov     ax,3524h        ; get address of previous
  45.         int     21h             ; INT 24H handler and save it
  46.  
  47.         mov     word ptr save24,bx
  48.         mov     word ptr save24+2,es
  49.  
  50.         push    cs              ; set DS:DX to point to
  51.         pop     ds              ; new INT 24H handler
  52.         mov     dx,offset _TEXT:int24
  53.         mov     ax,2524h        ; then call MS-DOS to
  54.         int     21h             ; set the INT 24H vector
  55.  
  56.         pop     es              ; restore segment registers
  57.         pop     ds
  58.         ret                     ; and return to caller
  59.  
  60. get24   endp
  61.  
  62.  
  63.         public  res24
  64. res24   proc    near            ; restore original contents
  65.                                 ; of Int 24H vector
  66.  
  67.         push    ds              ; save our data segment
  68.  
  69.         lds     dx,save24       ; put address of old handler
  70.         mov     ax,2524h        ; back into INT 24H vector
  71.         int     21h
  72.  
  73.         pop     ds              ; restore data segment
  74.         ret                     ; and return to caller
  75.  
  76. res24   endp
  77.  
  78. ;
  79. ; This is the replacement critical error handler.  It
  80. ; prompts the user for Abort, Retry, Ignore, or Fail and
  81. ; returns the appropriate code to the MS-DOS kernel.
  82. int24   proc    far             ; entered from MS-DOS kernel
  83.  
  84.         push    bx              ; save registers
  85.         push    cx
  86.         push    dx
  87.         push    si
  88.         push    di
  89.         push    bp
  90.         push    ds
  91.         push    es
  92.  
  93. int24a: mov     ax,DGROUP       ; display prompt for user
  94.         mov     ds,ax           ; using function 09H (print string
  95.         mov     es,ax           ; terminated by $ character)
  96.         mov     dx,offset prompt
  97.         mov     ah,09h
  98.         int     21h
  99.  
  100.         mov     ah,01h          ; get user's response
  101.         int     21h             ; Function 01H = read one character
  102.  
  103.         mov     di,offset keys  ; look up code for response key
  104.         mov     cx,keys_len
  105.         cld
  106.         repne scasb
  107.         jnz     int24a          ; prompt again if bad response
  108.  
  109.                                 ; set AL = action code for MS-DOS
  110.                                 ; according to key that was entered:
  111.                                 ; 0 = ignore, 1 = retry, 2 = abort, 3 = fail
  112.         mov     al,[di+keys_len-1]
  113.  
  114.         pop     es              ; restore registers
  115.         pop     ds
  116.         pop     bp
  117.         pop     di
  118.         pop     si
  119.         pop     dx
  120.         pop     cx
  121.         pop     bx
  122.         iret                    ; exit critical error handler
  123.  
  124. int24   endp
  125.  
  126. _TEXT   ends
  127.  
  128.         end
  129.