home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c082_122 / 10.ddi / TVSRC.ZIP / SYSINT.ASM < prev    next >
Encoding:
Assembly Source File  |  1992-06-10  |  16.5 KB  |  658 lines

  1. ;/*------------------------------------------------------------*/
  2. ;/* filename -       sysint.asm                                */
  3. ;/*                                                            */
  4. ;/* function(s)                                                */
  5. ;/*                  TSystemError member function              */
  6. ;/*------------------------------------------------------------*/
  7.  
  8. ;/*------------------------------------------------------------*/
  9. ;/*                                                            */
  10. ;/*    Turbo Vision -  Version 1.0                             */
  11. ;/*                                                            */
  12. ;/*                                                            */
  13. ;/*    Copyright (c) 1991 by Borland International             */
  14. ;/*    All Rights Reserved.                                    */
  15. ;/*                                                            */
  16. ;/*------------------------------------------------------------*/
  17.  
  18.         TITLE   SYSINT
  19.         MODEL   LARGE, PROLOG
  20.  
  21.         PUBLIC  @TSystemError@suspend$qv
  22.         PUBLIC  @TSystemError@resume$qv
  23.  
  24.         EXTRN   @TSystemError@sysErrorFunc:CODEPTR
  25.  
  26. IFDEF   PROTECT
  27.  
  28.         ;EXTRN   TDHasKybd:BYTE
  29.         EXTRN   _biosSeg:WORD
  30. ENDIF
  31.  
  32.         LOCALS  @@
  33.  
  34. ; Keyboard scan codes
  35.  
  36. scSpaceKey      EQU     39H
  37. scInsKey        EQU     52H
  38. scDelKey        EQU     53H
  39.  
  40. ; Keyboard shift flags
  41.  
  42. kbShiftKey      EQU     03H
  43. kbCtrlKey       EQU     04H
  44. kbAltKey        EQU     08H
  45.  
  46. ; ROM BIOS workspace
  47.  
  48. KeyFlags        EQU     (BYTE PTR 17H)
  49. KeyBufHead      EQU     (WORD PTR 1AH)
  50. KeyBufTail      EQU     (WORD PTR 1CH)
  51. KeyBufOrg       EQU     (WORD PTR 1EH)
  52. KeyBufEnd       EQU     (WORD PTR 3EH)
  53.  
  54. ; DOS function call classes
  55.  
  56. cNothing        EQU     0       ;No check needed
  57. cName           EQU     2       ;Check name at DS:DX
  58. cHandle         EQU     4       ;Check handle in BX
  59. cDrive          EQU     6       ;Check drive in DL
  60.  
  61. ; Data segment
  62.  
  63. DATASEG
  64.  
  65. ; Externals
  66.  
  67.         EXTRN   @TSystemError@ctrlBreakHit:BYTE
  68.         EXTRN   @TSystemError@saveCtrlBreak:BYTE
  69.         EXTRN   @TSystemError@inIDE:BYTE
  70.  
  71. IFDEF PROTECT
  72.  
  73. ; DS-based variables
  74.  
  75. SaveInt09       DD      ?       ;Saved INT 09H vector
  76. SaveInt1B       DD      ?       ;Saved INT 1BH vector
  77. SaveInt21       DD      ?       ;Saved INT 21H vector
  78. SaveInt23       DD      ?       ;Saved INT 23H vector
  79. SaveInt24       DD      ?       ;Saved INT 24H vector
  80. SaveInt10       DD      ?       ;Saved INT 10H vector
  81.  
  82. ENDIF
  83.  
  84. ; Code segment
  85.  
  86. CODESEG
  87.  
  88. IFDEF PROTECT
  89. ELSE
  90.  
  91. ; CS-based variables
  92.  
  93. SaveInt09       DD      ?       ;Saved INT 09H vector
  94. SaveInt1B       DD      ?       ;Saved INT 1BH vector
  95. SaveInt21       DD      ?       ;Saved INT 21H vector
  96. SaveInt23       DD      ?       ;Saved INT 23H vector
  97. SaveInt24       DD      ?       ;Saved INT 24H vector
  98.  
  99. ENDIF
  100.  
  101. ; Keyboard conversion table
  102.  
  103. KeyConvertTab   LABEL   BYTE
  104.  
  105.         DB      scSpaceKey,kbAltKey
  106.         DW      0200H
  107.         DB      scInsKey,kbCtrlKey
  108.         DW      0400H
  109.         DB      scInsKey,kbShiftKey
  110.         DW      0500H
  111.         DB      scDelKey,kbCtrlKey
  112.         DW      0600H
  113.         DB      scDelKey,kbShiftKey
  114.         DW      0700H
  115.  
  116. KeyConvertCnt   EQU     ($-KeyConvertTab)/4
  117.  
  118. ; DOS function call class table
  119.  
  120. FuncClassTab    LABEL   BYTE
  121.  
  122.         DB      cDrive          ;36H - Get disk free space
  123.         DB      cNothing
  124.         DB      cNothing
  125.         DB      cName           ;39H - Make directory
  126.         DB      cName           ;3AH - Remove directory
  127.         DB      cName           ;3BH - Change directory
  128.         DB      cName           ;3CH - Create file
  129.         DB      cName           ;3DH - Open file
  130.         DB      cHandle         ;3EH - Close file
  131.         DB      cHandle         ;3FH - Read file
  132.         DB      cHandle         ;40H - Write file
  133.         DB      cName           ;41H - Delete file
  134.         DB      cHandle         ;42H - Seek file
  135.         DB      cName           ;43H - Change file attributes
  136.         DB      cNothing
  137.         DB      cNothing
  138.         DB      cNothing
  139.         DB      cDrive          ;47H - Get current directory
  140.         DB      cNothing
  141.         DB      cNothing
  142.         DB      cNothing
  143.         DB      cName           ;4BH - Load or execute program
  144.         DB      cNothing
  145.         DB      cNothing
  146.         DB      cName           ;4EH - Find first
  147.         DB      cNothing
  148.         DB      cNothing
  149.         DB      cNothing
  150.         DB      cNothing
  151.         DB      cNothing
  152.         DB      cNothing
  153.         DB      cNothing
  154.         DB      cName           ;56H - Rename file
  155.         DB      cHandle         ;57H - Get/Set file date and time
  156.  
  157. ; Function check routines table
  158.  
  159. FuncCheckTab    LABEL   WORD
  160.  
  161.         DW      CheckNothing
  162.         DW      CheckName
  163.         DW      CheckHandle
  164.         DW      CheckDrive
  165.  
  166. ; Install system error handlers
  167.  
  168. @TSystemError@resume$qv proc far
  169.         PUSH    SI
  170.         PUSH    DI
  171.         MOV     AX,3300H
  172.         INT     21H
  173.         MOV     @TSystemError@saveCtrlBreak,DL
  174.         MOV     AX,3301H
  175.         MOV     DL,0
  176.         INT     21H
  177.         PUSH    DS
  178. IFDEF PROTECT
  179. if 0
  180.  
  181.         JMP     SHORT @@P00
  182.  
  183. PROTINSTALL:
  184.         INT     21H                     ; get current vector
  185.         XCHG    BX,CX
  186.         MOV     DS:[BX],CX              ; save
  187.         MOV     DS:[BX+2],ES
  188.         MOV     AH,25H                  ; set new vector
  189.         PUSH    DS
  190.         PUSH    CS
  191.         POP     DS
  192.         INT     21H
  193.         POP     DS
  194.         RETN
  195.  
  196. @@P00:  
  197.         MOV     AX,SEG DGROUP
  198.         MOV     DS,AX
  199.  
  200.         ;CMP     TDHasKybd,0
  201.         ;JNZ     @@P01
  202.  
  203.         LEA     CX,SaveInt09
  204.         LEA     DX,Int09Handler
  205.         MOV     AX,3509H
  206.         CALL    NEAR PTR PROTINSTALL
  207. @@P01:
  208.         LEA     CX,SaveInt1B
  209.         LEA     DX,Int1BHandler
  210.         MOV     AX,351BH
  211.         CALL    NEAR PTR PROTINSTALL
  212.  
  213.         LEA     CX,SaveInt21
  214.         LEA     DX,Int21Handler
  215.         MOV     AX,3521H
  216.         CALL    NEAR PTR PROTINSTALL
  217.  
  218.         LEA     CX,SaveInt23
  219.         LEA     DX,Int23Handler
  220.         MOV     AX,3523H
  221.         CALL    NEAR PTR PROTINSTALL
  222.  
  223.         LEA     CX,SaveInt24
  224.         LEA     DX,Int24Handler
  225.         MOV     AX,3524H
  226.         CALL    NEAR PTR PROTINSTALL
  227.  
  228.         LEA     CX,SaveInt10
  229.         LEA     DX,Int10Handler
  230.         MOV     AX,3510H
  231.         CALL    NEAR PTR PROTINSTALL
  232.  
  233.         MOV     AH,0BH
  234.         INT     21H
  235.  
  236.         PUSH    DS
  237.         MOV     DX,word ptr [SaveInt10]
  238.         MOV     DS,word ptr [SaveInt10+2]
  239.         MOV     AX,2510H
  240.         INT     21H
  241.         POP     DS
  242. endif
  243. ELSE
  244.         XOR     AX,AX
  245.         MOV     DS,AX
  246.         MOV     DI,OFFSET SaveInt09
  247.         PUSH    CS
  248.         POP     ES
  249.         CLD
  250.         CLI
  251.         MOV     SI,09H*4
  252.         MOVSW
  253.         MOVSW
  254.         MOV     SI,1BH*4
  255.         MOVSW
  256.         MOVSW
  257.         MOV     SI,21H*4
  258.         MOVSW
  259.         MOVSW
  260.         MOV     SI,23H*4
  261.         MOVSW
  262.         MOVSW
  263.         MOVSW
  264.         MOVSW
  265.  
  266.         MOV     AX,SEG @TSystemError@inIDE
  267.         MOV     ES,AX
  268.         CMP     ES:@TSystemError@inIDE,0
  269.         JNE     @@2
  270.  
  271. @@1:    MOV     WORD PTR DS:[09H*4+0],OFFSET Int09Handler
  272.         MOV     WORD PTR DS:[09H*4+2],CS
  273. @@2:    MOV     WORD PTR DS:[1BH*4+0],OFFSET Int1BHandler
  274.         MOV     WORD PTR DS:[1BH*4+2],CS
  275.         MOV     AX,DS:[410H]
  276.         AND     AX,0C1H
  277.         DEC     AX
  278.         JNE     @@3
  279.         MOV     WORD PTR DS:[21H*4+0],OFFSET Int21Handler
  280.         MOV     WORD PTR DS:[21H*4+2],CS
  281. @@3:    MOV     WORD PTR DS:[23H*4+0],OFFSET Int23Handler
  282.         MOV     WORD PTR DS:[23H*4+2],CS
  283.         MOV     WORD PTR DS:[24H*4+0],OFFSET Int24Handler
  284.         MOV     WORD PTR DS:[24H*4+2],CS
  285.         STI
  286.         MOV     AX,CS
  287.         XCHG    AX,WORD PTR DS:[10H*4+2]
  288.         PUSH    AX
  289.         MOV     AX,OFFSET CS:Int10Handler
  290.         XCHG    AX,WORD PTR DS:[10H*4+0]
  291.         PUSH    AX
  292.         MOV     AH,0BH
  293.         INT     21H
  294.         POP     DS:WORD PTR [10H*4+0]
  295.         POP     DS:WORD PTR [10H*4+2]
  296. ENDIF
  297.         POP     DS
  298.         POP     DI
  299.         POP     SI
  300.         RET
  301. @TSystemError@resume$qv endp
  302.  
  303. ; Remove system error handlers
  304.  
  305. @TSystemError@suspend$qv proc far
  306.  
  307.         PUSH    SI
  308.         PUSH    DI
  309.         PUSH    DS
  310.  
  311. IFDEF PROTECT
  312. if 0
  313.         PUSH    DS
  314.         MOV     DX,word ptr [SaveInt09]
  315.         MOV     DS,word ptr [SaveInt09+2]
  316.         MOV     AX,2509H
  317.         INT     21H
  318.         POP     DS
  319.  
  320.         PUSH    DS
  321.         MOV     DX,word ptr [SaveInt1B]
  322.         MOV     DS,word ptr [SaveInt1B+2]
  323.         MOV     AX,251BH
  324.         INT     21H
  325.         POP     DS
  326.  
  327.         PUSH    DS
  328.         MOV     DX,word ptr [SaveInt21]
  329.         MOV     DS,word ptr [SaveInt21+2]
  330.         MOV     AX,2521H
  331.         INT     21H
  332.         POP     DS
  333.  
  334.         PUSH    DS
  335.         MOV     DX,word ptr [SaveInt23]
  336.         MOV     DS,word ptr [SaveInt23+2]
  337.         MOV     AX,2523H
  338.         INT     21H
  339.         POP     DS
  340.  
  341.         PUSH    DS
  342.         MOV     DX,word ptr [SaveInt24]
  343.         MOV     DS,word ptr [SaveInt24+2]
  344.         MOV     AX,2524H
  345.         INT     21H
  346.         POP     DS
  347. endif
  348. ELSE
  349.         MOV     SI,OFFSET SaveInt09
  350.         PUSH    CS
  351.         POP     DS
  352.         XOR     AX,AX
  353.         MOV     ES,AX
  354.         CLD
  355.         CLI
  356.         MOV     DI,09H*4
  357.         MOVSW
  358.         MOVSW
  359.         MOV     DI,1BH*4
  360.         MOVSW
  361.         MOVSW
  362.         MOV     DI,21H*4
  363.         MOVSW
  364.         MOVSW
  365.         MOV     DI,23H*4
  366.         MOVSW
  367.         MOVSW
  368.         MOVSW
  369.         MOVSW
  370.         STI
  371. ENDIF
  372.         POP     DS
  373.         MOV     AX,3301H
  374.         MOV     DL,@TSystemError@saveCtrlBreak
  375.         INT     21H
  376.         POP     DI
  377.         POP     SI
  378.         RET
  379. @TSystemError@suspend$qv endp
  380.  
  381. ; INT 09H handler signature
  382.  
  383.         DB      'TVI9'
  384.  
  385. ; INT 09H handler
  386.  
  387. Int09Handler proc far
  388.  
  389.         PUSH    DS
  390.         PUSH    DI
  391.         PUSH    AX
  392. IFDEF PROTECT
  393.         MOV     AX,SEG DGROUP
  394.         MOV     DS,AX
  395.         MOV     DS,DS:_biosSeg
  396. ELSE
  397.         MOV     AX,40H
  398.         MOV     DS,AX
  399. ENDIF
  400.         MOV     DI,DS:KeyBufTail
  401.         IN      AL,60H
  402.         MOV     AH,DS:KeyFlags
  403.         PUSHF
  404.         CALL    SaveInt09
  405.         TEST    AL,80H
  406.         JNE     @@9
  407.         PUSH    SI
  408.         PUSH    CX
  409.         MOV     SI,OFFSET CS:KeyConvertTab
  410.         MOV     CX,KeyConvertCnt
  411. @@1:    CMP     AL,CS:[SI]
  412.         JNE     @@2
  413.         TEST    AH,CS:[SI+1]
  414.         JNE     @@3
  415. @@2:    ADD     SI,4
  416.         LOOP    @@1
  417.         JMP     SHORT @@8
  418. @@3:    CMP     DI,DS:KeyBufTail
  419.         JNE     @@5
  420.         MOV     AX,DI
  421.         INC     AX
  422.         INC     AX
  423.         CMP     AX,OFFSET KeyBufEnd
  424.         JNE     @@4
  425.         MOV     AX,OFFSET KeyBufOrg
  426. @@4:    CMP     AX,DS:KeyBufHead
  427.         JE      @@8
  428.         MOV     DS:KeyBufTail,AX
  429.         MOV     DI,AX
  430. @@5:    MOV     AX,CS:[SI+2]
  431.         MOV     DS:[DI],AX
  432. @@8:    POP     CX
  433.         POP     SI
  434. @@9:    POP     AX
  435.         POP     DI
  436.         POP     DS
  437.         IRET
  438. Int09Handler endp
  439.  
  440. ; INT 1BH handler
  441.  
  442. Int1BHandler proc far
  443.  
  444.         PUSH    DS
  445.         PUSH    AX
  446.         XOR     AX,AX
  447.         MOV     DS,AX
  448.         AND     BYTE PTR DS:[471H],7FH
  449.         MOV     AX,SEG DGROUP
  450.         MOV     DS,AX
  451.         MOV     @TSystemError@ctrlBreakHit,1
  452.         POP     AX
  453.         POP     DS
  454.         IRET
  455. Int1BHandler endp
  456.  
  457. ; INT 21H handler
  458.  
  459. Int21Handler proc far
  460.  
  461.         PUSHF
  462.         STI
  463.         CMP     AH,36H
  464.         JB      @@1
  465.         CMP     AH,57H
  466.         JA      @@1
  467.         PUSH    DX
  468.         PUSH    BX
  469.         MOV     BL,AH
  470.         XOR     BH,BH
  471.         MOV     BL,CS:FuncClassTab[BX-36H]
  472.         CALL    CS:FuncCheckTab[BX]
  473.         POP     BX
  474.         POP     DX
  475.         JC      @@2
  476. @@1:    POPF
  477.         JMP     SaveInt21
  478. @@2:    POPF
  479.         STI
  480.         CMP     AH,36H
  481.         MOV     AX,0FFFFH
  482.         JE      @@3
  483.         MOV     AX,5
  484. @@3:    STC
  485.         RETF    2
  486. Int21Handler endp
  487.  
  488. ; Check filename
  489.  
  490. CheckName:
  491.  
  492.         MOV     BX,DX
  493.         MOV     DX,[BX]
  494.         AND     DL,1FH
  495.         DEC     DL
  496.         CMP     DH,':'
  497.         JE      CheckAbsDrive
  498.         JMP     SHORT CheckCurDrive
  499.  
  500. ; Check handle
  501.  
  502. CheckHandle:
  503.  
  504.         MOV     BX,SP
  505.         MOV     BX,SS:[BX+2]
  506.         PUSH    AX
  507.         MOV     AX,4400H
  508.         PUSHF
  509.         CALL    SaveInt21
  510.         POP     AX
  511.         OR      DL,DL
  512.         JNS     CheckAbsDrive
  513.         JMP     SHORT CheckNothing
  514.  
  515. ; Check drive
  516.  
  517. CheckDrive:
  518.  
  519.         DEC     DL
  520.         JNS     CheckAbsDrive
  521.  
  522. ; Check current drive
  523.  
  524. CheckCurDrive:
  525.  
  526.         PUSH    AX
  527.         MOV     AH,19H
  528.         PUSHF
  529.         CALL    SaveInt21
  530.         MOV     DL,AL
  531.         POP     AX
  532.  
  533. ; Check absolute drive
  534. ; In    DL = Drive (0=A, 1=B, etc)
  535. ; Out   CF = 1 if drive swap failed
  536.  
  537. CheckAbsDrive:
  538.  
  539.         CMP     DL,2
  540.         JAE     CheckNothing
  541.         PUSH    DS
  542.         PUSH    AX
  543.  
  544. IFDEF PROTECT
  545.         MOV     AX,SEG DGROUP
  546.         MOV     DS,AX
  547.         MOV     DS,DS:_biosSeg
  548. ELSE
  549.         MOV     AX,40H
  550.         MOV     DS,AX
  551. ENDIF
  552.  
  553.         MOV     AL,DS:[104H]
  554.         CMP     AL,0FFH
  555.         JE      @@1
  556.         CMP     DL,AL
  557.         JE      @@1
  558.         PUSH    ES
  559.         PUSH    DS
  560.         PUSH    DI
  561.         PUSH    SI
  562.         PUSH    DX
  563.         PUSH    CX
  564.         MOV     AX,SEG DGROUP
  565.         MOV     DS,AX
  566.         ASSUME  DS:DGROUP
  567.         MOV     AX,15
  568.         PUSH    AX
  569.         PUSH    DX
  570.         MOV     AX,SEG @TSystemError@sysErrorFunc
  571.         MOV     ES,AX
  572.         CALL    [ES:@TSystemError@sysErrorFunc]
  573.         POP     CX
  574.         POP     DX
  575.         POP     SI
  576.         POP     DI
  577.         POP     DS
  578.         POP     ES
  579.         NEG     AX
  580.         JC      @@1
  581.         MOV     DS:[504H],DL
  582. @@1:    POP     AX
  583.         POP     DS
  584.  
  585. ; No check required
  586.  
  587. CheckNothing:
  588.  
  589.         RET
  590.  
  591. ; INT 23H and temporary INT 10H handler
  592.  
  593. Int10Handler:
  594. Int23Handler:
  595.  
  596.         IRET
  597.  
  598. ; INT 24H handler
  599.  
  600. Int24Handler proc far
  601.  
  602.         STI                             ;Enable interrupts
  603.         PUSH    ES                      ;Save registers
  604.         PUSH    DS
  605.         PUSH    BP
  606.         PUSH    DI
  607.         PUSH    SI
  608.         PUSH    DX
  609.         PUSH    CX
  610.         PUSH    BX
  611.         AND     DI,0FFH                 ;Error code in low byte
  612.         PUSH    DI                      ;Save error code
  613.         CMP     DI,9                    ;Printer out of paper
  614.         JE      @@0                     ;Yes, @@0
  615.         TEST    AH,80H                  ;Disk error?
  616.         JE      @@1                     ;Yes, @@1
  617.         MOV     DI,13                   ;Bad memory image of FAT
  618.         MOV     DS,BP                   ;Point DS:SI to device header
  619.         TEST    BYTE PTR DS:[SI+5],80H  ;Block device?
  620.         JE      @@1                     ;Yes, @@0
  621.         INC     DI                      ;Device access error
  622. @@0:    MOV     AL,0FFH                 ;No drive code
  623. @@1:    MOV     DX,SEG DGROUP           ;Setup DS
  624.         MOV     DS,DX
  625.         PUSH    AX                      ;Push drive code
  626.         PUSH    DI                      ;Push error code
  627.         MOV     AX,SEG @TSystemError@sysErrorFunc
  628.         MOV     ES,AX
  629.         CALL    [ES:@TSystemError@sysErrorFunc] ;Call system error handler
  630.         ADD     SP,4                    ;Clean up arguments
  631.         POP     DI                      ;Restore error code
  632.         OR      AX,AX                   ;Zero if retry
  633.         MOV     AX,1                    ;Retry return code
  634.         JE      @@3                     ;Jump if retry
  635.         ADD     SP,(8+3)*2              ;Remove saved regs and INT
  636.         POP     AX                      ;Get INT 21H AX register
  637.         ADD     DI,19                   ;Return AX = 19..31
  638.         CMP     AH,39H                  ;DOS 2.0 style function?
  639.         JAE     @@2                     ;Yes, @@1
  640.         MOV     DI,0FFFFH               ;Return AX = 0FFFFH
  641. @@2:    MOV     AH,54H                  ;Dummy function call to get
  642.         INT     21H                     ;DOS into a stable state
  643.         MOV     AX,DI                   ;Get return code
  644.         MOV     BP,SP                   ;Set CF in return flags
  645.         OR      BYTE PTR [BP+20],1
  646. @@3:    POP     BX                      ;Restore registers
  647.         POP     CX
  648.         POP     DX
  649.         POP     SI
  650.         POP     DI
  651.         POP     BP
  652.         POP     DS
  653.         POP     ES
  654.         IRET
  655. Int24Handler endp
  656.  
  657.         END
  658.