home *** CD-ROM | disk | FTP | other *** search
/ Piper's Pit BBS/FTP: ibm 0000 - 0009 / ibm0000-0009 / ibm0003.tar / ibm0003 / TPOWER53.ZIP / TPASM.ARC / TPINT24.ASM < prev    next >
Encoding:
Assembly Source File  |  1989-07-10  |  4.0 KB  |  171 lines

  1. ;******************************************************
  2. ;           TPINT24.ASM 5.07
  3. ;        Critical error handler
  4. ;     Copyright (c) TurboPower Software 1987.
  5. ; Portions copyright (c) Sunny Hill Software 1985, 1986
  6. ;     and used under license to    TurboPower Software
  7. ;         All rights reserved.
  8. ;******************************************************
  9.  
  10.     INCLUDE    TPCOMMON.ASM
  11.  
  12. ;******************************************************    Data
  13.  
  14. DATA    SEGMENT    WORD PUBLIC
  15.  
  16.     EXTRN    SaveInt24 : DWORD        ;DOS's Int24 handler
  17.  
  18.     TPInt24    Pointer    <>            ;Turbo's Int24 handler
  19.  
  20. DATA    ENDS
  21.  
  22. ;******************************************************    Code
  23.  
  24. CODE    SEGMENT    BYTE PUBLIC
  25.  
  26.     ASSUME    CS:CODE,DS:DATA
  27.  
  28.     PUBLIC    Int24Result, Int24On, Int24Off,    Int24Init
  29.  
  30.     EXTRN    IoResultPrimitive : NEAR    ;Pascal    routine
  31.  
  32.  
  33. ;CS-relative data:
  34. Int24Err    DB    0        ;Boolean -- 1 means critical error
  35. Int24ErrCode    DB    0        ;Byte -- the DOS error code
  36. Dos3Plus    DB    True        ;Boolean - True    if running DOS 3.x or
  37.                     ; higher
  38.  
  39. ;******************************************************    Int24
  40.  
  41. ;procedure Int24
  42. ;Interrupt handler for DOS critical errors
  43.  
  44. FailCode    = 3
  45. IgnoreCode    = 0
  46.  
  47. Int24        PROC NEAR
  48.  
  49.     MOV    CS:Int24Err,True    ;Set error flag
  50.     XCHG    AX,DI            ;DI has    error code on entry
  51.     MOV    CS:Int24ErrCode,AL    ;Store error code for later
  52.     XCHG    AX,DI            ;Restore AX
  53.     MOV    AL,FailCode        ;Fail the DOS call
  54.     CMP    CS:Dos3Plus,True    ;DOS 3.x or higher?
  55.     JE    Int24Exit        ;If so,    done
  56.     MOV    AL,IgnoreCode        ;else, tell DOS    to I)gnore error instead
  57. Int24Exit:
  58.     IRET                ;Return
  59.  
  60. Int24        ENDP
  61.  
  62. ;******************************************************    Int24Result
  63.  
  64. ;function Int24Result :    Word;
  65.  
  66. ;Returns DOS critical error code in high byte, IoResult    in low byte.
  67.  
  68. Int24Result    PROC FAR
  69.  
  70.     CALL    IoResultPrimitive    ;Get IoResult into AX
  71.     CMP    CS:Int24Err,True    ;Critical error    flag set?
  72.     JNE    IrExit            ;No? Done
  73.  
  74.     ;Merge critical    error code into    result
  75.  
  76.     MOV    AH,CS:Int24ErrCode    ;Int24ErrCode into AH
  77.     OR    AH,AH            ;Is AH 0?
  78.     JNZ    IrAHnot0        ;If not, continue
  79.     MOV    AH,0Dh            ;Else, attempt to write    to
  80.                     ;write protected disk. Map to $0D.
  81. IrAHnot0:
  82.     MOV    CS:Int24ErrCode,0    ;Reset Int24ErrCode to 0
  83.     MOV    CS:Int24Err,False    ;Clear error flag
  84.  
  85. IrExit:
  86.     RET
  87.  
  88. Int24Result    ENDP
  89.  
  90. ;******************************************************    Int24On
  91.  
  92. ;procedure Int24On;
  93.  
  94. ;Install DOS critical error handler.
  95.  
  96. Int24On        PROC FAR
  97.  
  98.     PUSH    DS            ;Save DS
  99.  
  100.     ;Install new critical error handler
  101.  
  102.     PUSH    CS            ;Get CS...
  103.     POP    DS            ; into DS
  104.     MOV    DX,Offset Int24        ;DS:DX points to Int24
  105.     MOV    AX,2524h        ;AH = Set vector, AL = vector to set
  106.     INT    21h            ;Call DOS
  107.  
  108.     ;Initialize variables
  109.  
  110.     MOV    CS:Int24Err,False    ;Clear error flag
  111.     MOV    CS:Int24ErrCode,0    ;Clear error code
  112.  
  113.     POP    DS            ;Restore DS
  114.     RET
  115.  
  116. Int24On        ENDP
  117.  
  118. ;******************************************************    Int24Off
  119.  
  120. ;procedure Int24Off(RestoreDosHandler :    Boolean);
  121.  
  122. ;Restore DOS critical error handler or Turbo's.
  123.  
  124. SwitchDos    EQU    BYTE PTR SS:[BX+4]
  125.  
  126. Int24Off    PROC FAR
  127.  
  128.     StackFrame
  129.     PUSH    DS            ;Save DS
  130.  
  131.     CMP    SwitchDos,True        ;Switch    to DOS's handler?
  132.     JNE    IOuseTP            ;if not, switch    to Turbo's
  133.     MOV    DX,SaveInt24.Ofst    ;DX = old offset stored    by Turbo
  134.     MOV    DS,SaveInt24.Segm    ;DS:DX points to old ISR
  135.     JMP    SHORT IOgo
  136. IOuseTP:
  137.     MOV    DX,TPInt24.Ofst        ;DX = old offset
  138.     MOV    DS,TPInt24.Segm        ;DS:DX points to old ISR
  139. IOgo:
  140.     MOV    AX,2524h        ;AH = Set vector, AL = vector to set
  141.     INT    21h            ;Call DOS
  142.     MOV    CS:Int24Err,False    ;Clear error flag
  143.     POP    DS            ;Restore DS
  144.     RET
  145.  
  146. Int24Off    ENDP
  147.  
  148. ;******************************************************    Int24Init
  149.  
  150. ;procedure Int24Init;
  151. ;Save Turbo's vector.
  152.  
  153. Int24Init    PROC NEAR
  154.  
  155.     ;Get and save address of old critical error handler
  156.     GetVector 24h, TPInt24        ;Save current vector in    TPInt24
  157.     DosCall    30h            ;Get DOS version
  158.     XCHG    AL,AH            ;Major version # in AH,    minor in AL
  159.     MOV    CS:Dos3Plus,True    ;Assume    DOS 3.x    or higher
  160.     CMP    AX,0300h        ;Is it?
  161.     JAE    InitExit        ;If so,    exit
  162.     MOV    CS:Dos3Plus,False    ;Else, Dos3Plus    is False
  163. InitExit:
  164.     RET
  165.  
  166. Int24Init    ENDP
  167.  
  168. CODE    ENDS
  169.  
  170.     END
  171.