home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l040 / 13.ddi / RTLSYS.ZIP / FCTL.ASM < prev    next >
Encoding:
Assembly Source File  |  1992-10-28  |  4.3 KB  |  324 lines

  1.  
  2. ; *******************************************************
  3. ; *                            *
  4. ; *     Turbo Pascal Run-time Library                   *
  5. ; *    File Control Routines                *
  6. ; *                            *
  7. ; *     Copyright (c) 1988,92 Borland International     *
  8. ; *                            *
  9. ; *******************************************************
  10.  
  11.     TITLE    FCTL
  12.  
  13.     INCLUDE    SE.ASM
  14.  
  15. DATA    SEGMENT    WORD PUBLIC
  16.  
  17. ; Externals
  18.  
  19.     EXTRN    FileMode:BYTE,InOutRes:WORD
  20.  
  21. DATA    ENDS
  22.  
  23.     IF WindowsVersion
  24.  
  25. ; Windows entry points
  26.  
  27.     EXTRN    AnsiToOem:FAR
  28.  
  29.     ENDIF
  30.  
  31. CODE    SEGMENT    BYTE PUBLIC
  32.  
  33.     ASSUME    CS:CODE,DS:DATA
  34.  
  35. ; Publics
  36.  
  37.     PUBLIC    AssignFile,ResetFile,RewriteFile,TruncFile,CloseFile
  38.     PUBLIC    ReadFile,WriteFile,ReadBlock,WriteBlock,SeekFile
  39.     PUBLIC    AssignFileC
  40.  
  41. ; Assign standard procedure (PChar)
  42.  
  43. AssignFileC:
  44.  
  45.     DB    0BAH            ;MOV DX,immed
  46.  
  47. ; Assign standard procedure (String)
  48.  
  49. AssignFile:
  50.  
  51.     XOR    DX,DX
  52.     MOV    BX,SP
  53.     PUSH    DS
  54.     LES    DI,SS:[BX+8]
  55.     LDS    SI,SS:[BX+4]
  56.     CLD
  57.     XOR    AX,AX
  58.     STOSW
  59.     MOV    AX,fmClosed
  60.     STOSW
  61.     XOR    AX,AX
  62.     MOV    CX,(fName-fBufSize)/2
  63.     REP    STOSW
  64.     IF WindowsVersion
  65.     PUSH    ES
  66.     PUSH    DI
  67.     PUSH    ES
  68.     PUSH    DI
  69.     ENDIF
  70.     MOV    CX,79
  71.     OR    DX,DX
  72.     JNE    @@1
  73.     LODSB
  74.     CMP    CL,AL
  75.     JBE    @@1
  76.     MOV    CL,AL
  77.     JCXZ    @@2
  78. @@1:    LODSB
  79.     OR    AL,AL
  80.     JE    @@2
  81.     STOSB
  82.     LOOP    @@1
  83. @@2:    XOR    AL,AL
  84.     STOSB
  85.     IF WindowsVersion
  86.     CALL    AnsiToOem
  87.     ENDIF
  88.     POP    DS
  89.     RETF    8
  90.  
  91. ; Reset standard procedure
  92.  
  93. ResetFile:
  94.  
  95.     MOV    AL,FileMode
  96.     MOV    AH,dosOpen
  97.     XOR    DX,DX
  98.     JMP    SHORT OpenFile
  99.  
  100. ; Rewrite standard procedure
  101.  
  102. RewriteFile:
  103.  
  104.     MOV    AX,dosCreate*256
  105.     MOV    DX,1
  106.  
  107. ; Open file
  108.  
  109. OpenFile:
  110.  
  111.     ARG    FileP,DWORD,1
  112.     ARG    RecSize,WORD,1
  113.  
  114.     ENTRY    FAR
  115.     LES    DI,FileP
  116.     CMP    ES:[DI].fMode,fmClosed
  117.     JE    @@2
  118.     CMP    ES:[DI].fMode,fmInOut
  119.     JE    @@1
  120.     MOV    InOutRes,102
  121.     JMP    SHORT @@5
  122. @@1:    PUSH    AX
  123.     PUSH    DX
  124.     PUSH    ES
  125.     PUSH    DI
  126.     PUSH    CS
  127.     CALL    CloseFile
  128.     POP    DX
  129.     POP    AX
  130. @@2:    CMP    ES:[DI].fName,0
  131.     JE    @@3
  132.     PUSH    DS
  133.     LEA    DX,[DI].fName
  134.     PUSH    ES
  135.     POP    DS
  136.     XOR    CX,CX
  137.     INT    DOS
  138.     POP    DS
  139.     JNC    @@4
  140.     MOV    InOutRes,AX
  141.     JMP    SHORT @@5
  142. @@3:    XCHG    AX,DX
  143. @@4:    MOV    ES:[DI].fMode,fmInOut
  144.     MOV    ES:[DI].fHandle,AX
  145.     MOV    AX,RecSize
  146.     MOV    ES:[DI].fBufSize,AX
  147. @@5:    EXIT
  148.  
  149. ; Truncate standard procedure
  150.  
  151. TruncFile:
  152.  
  153.     MOV    BX,SP
  154.     LES    DI,SS:[BX+4]
  155.     CALL    OpenCheck
  156.     JNE    @@1
  157.     XOR    CX,CX
  158.     MOV    BX,ES:[DI].fHandle
  159.     MOV    AH,dosWrite
  160.     INT    DOS
  161.     JNC    @@1
  162.     MOV    InOutRes,AX
  163. @@1:    RETF    4
  164.  
  165. ; Close standard procedure
  166.  
  167. CloseFile:
  168.  
  169.     MOV    BX,SP
  170.     LES    DI,SS:[BX+4]
  171.     CALL    OpenCheck
  172.     JNE    @@2
  173.     MOV    BX,ES:[DI].fHandle
  174.     CMP    BX,4
  175.     JBE    @@1
  176.     MOV    AH,dosClose
  177.     INT    DOS
  178.     JNC    @@1
  179.     MOV    InOutRes,AX
  180. @@1:    MOV    ES:[DI].fMode,fmClosed
  181. @@2:    RETF    4
  182.  
  183. ; Check that file is open
  184.  
  185. OpenCheck:
  186.  
  187.     CMP    ES:[DI].fMode,fmInOut
  188.     JE    @@1
  189.     MOV    InOutRes,103
  190. @@1:    RET
  191.  
  192. ; Read standard procedure
  193.  
  194. ReadFile:
  195.  
  196.     MOV    AH,dosRead
  197.     MOV    DX,100
  198.     JMP    SHORT InOutFile
  199.  
  200. ; Write standard procedure
  201.  
  202. WriteFile:
  203.  
  204.     MOV    AH,dosWrite
  205.     MOV    DX,101
  206.  
  207. ; Typed file I/O
  208.  
  209. InOutFile:
  210.  
  211.     ARG    FileP,DWORD,1
  212.     ARG    BufferP,DWORD,1
  213.  
  214.     ENTRY    FAR
  215.     LES    DI,FileP
  216.     CALL    OpenCheck
  217.     JNE    @@2
  218.     PUSH    DS
  219.     PUSH    DX
  220.     LDS    DX,BufferP
  221.     MOV    CX,ES:[DI].fBufSize
  222.     MOV    BX,ES:[DI].fHandle
  223.     INT    DOS
  224.     POP    DX
  225.     POP    DS
  226.     JC    @@1
  227.     CMP    AX,CX
  228.     JE    @@2
  229.     MOV    AX,DX
  230. @@1:    MOV    InOutRes,AX
  231. @@2:    EXIT    4
  232.  
  233. ; BlockRead standard procedure
  234.  
  235. ReadBlock:
  236.  
  237.     MOV    BL,dosRead
  238.     MOV    CX,100
  239.     JMP    SHORT InOutBlock
  240.  
  241. ; BlockWrite standard procedure
  242.  
  243. WriteBlock:
  244.  
  245.     MOV    BL,dosWrite
  246.     MOV    CX,101
  247.  
  248. ; Untyped file I/O
  249.  
  250. InOutBlock:
  251.  
  252.     ARG    FileP,DWORD,1
  253.     ARG    BufferP,DWORD,1
  254.     ARG    Count,WORD,1
  255.     ARG    ResultP,DWORD,1
  256.  
  257.     ENTRY    FAR
  258.     LES    DI,FileP
  259.     CALL    OpenCheck
  260.     JNE    @@4
  261.     MOV    AX,Count
  262.     OR    AX,AX
  263.     JE    @@1
  264.     PUSH    DS
  265.     PUSH    CX
  266.     MUL    ES:[DI].fBufSize
  267.     MOV    CX,AX
  268.     LDS    DX,BufferP
  269.     MOV    AH,BL
  270.     MOV    BX,ES:[DI].fHandle
  271.     INT    DOS
  272.     POP    CX
  273.     POP    DS
  274.     JC    @@3
  275.     XOR    DX,DX
  276.     DIV    ES:[DI].fBufSize
  277. @@1:    LES    DI,ResultP
  278.     MOV    DX,ES
  279.     OR    DX,DI
  280.     JE    @@2
  281.     MOV    ES:[DI],AX
  282.     JMP    SHORT @@5
  283. @@2:    CMP    AX,Count
  284.     JE    @@5
  285.     MOV    InOutRes,CX
  286.     JMP    SHORT @@5
  287. @@3:    MOV    InOutRes,AX
  288. @@4:    LES    DI,ResultP
  289.     MOV    DX,ES
  290.     OR    DX,DI
  291.     JE    @@5
  292.     XOR    AX,AX
  293.     MOV    ES:[DI],AX
  294. @@5:    EXIT
  295.  
  296. ; Seek standard procedure
  297.  
  298. SeekFile:
  299.  
  300.     ARG    FileP,DWORD,1
  301.     ARG    FilePos,DWORD,1
  302.  
  303.     ENTRY    FAR
  304.     LES    DI,FileP
  305.     CALL    OpenCheck
  306.     JNE    @@1
  307.     MOV    AX,FilePos.w2
  308.     MUL    ES:[DI].fBufSize
  309.     MOV    CX,AX
  310.     MOV    AX,FilePos.w0
  311.     MUL    ES:[DI].fBufSize
  312.     ADD    CX,DX
  313.     MOV    DX,AX
  314.     MOV    BX,ES:[DI].fHandle
  315.     MOV    AX,dosSeek*256
  316.     INT    DOS
  317.     JNC    @@1
  318.     MOV    InOutRes,AX
  319. @@1:    EXIT
  320.  
  321. CODE    ENDS
  322.  
  323.     END
  324.