home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / advmsdos / chap08 / int24.asm < prev    next >
Encoding:
Assembly Source File  |  1988-10-01  |  2.7 KB  |  131 lines

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