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

  1.  
  2. ; *******************************************************
  3. ; *                            *
  4. ; *     Turbo Pascal Run-time Library                   *
  5. ; *    Textfile Control Routines            *
  6. ; *                            *
  7. ; *     Copyright (c) 1988,92 Borland International     *
  8. ; *                            *
  9. ; *******************************************************
  10.  
  11.     TITLE    TCTL
  12.  
  13.     INCLUDE    SE.ASM
  14.  
  15. DATA    SEGMENT    WORD PUBLIC
  16.  
  17. ; Externals
  18.  
  19.     EXTRN    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. ; Externals
  36.  
  37.     EXTRN    FileOpen:FAR
  38.  
  39. ; Publics
  40.  
  41.     PUBLIC    AssignText,ResetText,RewriteText,AppendText
  42.     PUBLIC    FlushText,CloseText,BufferText,FileRead
  43.     PUBLIC    FileWrDev,FileWrite,FileClose,AssignTextC
  44.  
  45. ; Assign standard procedure (PChar)
  46.  
  47. AssignTextC:
  48.  
  49.     DB    0BAH            ;MOV DX,immed
  50.  
  51. ; Assign standard procedure (String)
  52.  
  53. AssignText:
  54.  
  55.     XOR    DX,DX
  56.     MOV    BX,SP
  57.     PUSH    DS
  58.     LES    DI,SS:[BX+8]
  59.     LDS    SI,SS:[BX+4]
  60.     CLD
  61.     XOR    AX,AX
  62.     STOSW
  63.     MOV    AX,fmClosed
  64.     STOSW
  65.     MOV    AX,128
  66.     STOSW
  67.     XOR    AX,AX
  68.     STOSW
  69.     STOSW
  70.     STOSW
  71.     LEA    AX,[DI].fBuffer-fBufPtr
  72.     STOSW
  73.     MOV    AX,ES
  74.     STOSW
  75.     MOV    AX,OFFSET FileOpen
  76.     STOSW
  77.     MOV    AX,SEG FileOpen
  78.     STOSW
  79.     XOR    AX,AX
  80.     MOV    CX,(fName-fInOutProc)/2
  81.     REP    STOSW
  82.     IF WindowsVersion
  83.     PUSH    ES
  84.     PUSH    DI
  85.     PUSH    ES
  86.     PUSH    DI
  87.     ENDIF
  88.     MOV    CX,79
  89.     OR    DX,DX
  90.     JNE    @@1
  91.     LODSB
  92.     CMP    CL,AL
  93.     JBE    @@1
  94.     MOV    CL,AL
  95.     JCXZ    @@2
  96. @@1:    LODSB
  97.     OR    AL,AL
  98.     JE    @@2
  99.     STOSB
  100.     LOOP    @@1
  101. @@2:    XOR    AL,AL
  102.     STOSB
  103.     IF WindowsVersion
  104.     CALL    AnsiToOem
  105.     ENDIF
  106.     POP    DS
  107.     RETF    8
  108.  
  109. ; SetTextBuf standard procedure
  110.  
  111. BufferText:
  112.  
  113.     MOV    BX,SP
  114.     LES    DI,SS:[BX+10]
  115.     MOV    AX,SS:[BX+4]
  116.     MOV    ES:[DI].fBufSize,AX
  117.     MOV    AX,SS:[BX+6].ofs
  118.     MOV    ES:[DI].fBufPtr.ofs,AX
  119.     MOV    AX,SS:[BX+6].seg
  120.     MOV    ES:[DI].fBufPtr.seg,AX
  121.     XOR    AX,AX
  122.     MOV    ES:[DI].fBufPos,AX
  123.     MOV    ES:[DI].fBufEnd,AX
  124.     RETF    10
  125.  
  126. ; Reset standard procedure
  127.  
  128. ResetText:
  129.  
  130.     MOV    DX,fmInput
  131.     JMP    SHORT OpenText
  132.  
  133. ; Rewrite standard procedure
  134.  
  135. RewriteText:
  136.  
  137.     MOV    DX,fmOutput
  138.     JMP    SHORT OpenText
  139.  
  140. ; Append standard procedure
  141.  
  142. AppendText:
  143.  
  144.     MOV    DX,fmInOut
  145.  
  146. ; Open textfile
  147.  
  148. OpenText:
  149.  
  150.     ARG    FileP,DWORD,1
  151.  
  152.     ENTRY    WINFAR
  153.     LES    DI,FileP
  154.     MOV    AX,ES:[DI].fMode
  155.     CMP    AX,fmInput
  156.     JE    @@1
  157.     CMP    AX,fmOutput
  158.     JE    @@1
  159.     CMP    AX,fmClosed
  160.     JE    @@2
  161.     MOV    InOutRes,102
  162.     JMP    SHORT @@3
  163. @@1:    PUSH    DX
  164.     PUSH    ES
  165.     PUSH    DI
  166.     PUSH    CS
  167.     CALL    CloseText
  168.     POP    DX
  169. @@2:    XOR    AX,AX
  170.     MOV    ES:[DI].fMode,DX
  171.     MOV    ES:[DI].fBufPos,AX
  172.     MOV    ES:[DI].fBufEnd,AX
  173.     MOV    BX,OFFSET fOpenProc
  174.     CALL    DoFunction
  175.     JE    @@3
  176.     MOV    ES:[DI].fMode,fmClosed
  177. @@3:    EXIT
  178.  
  179. ; Flush standard procedure
  180.  
  181. FlushText:
  182.  
  183.     MOV    AL,0
  184.     JMP    SHORT FlushClose
  185.  
  186. ; Close standard procedure
  187.  
  188. CloseText:
  189.  
  190.     MOV    AL,1
  191.  
  192. ; Flush or Close textfile
  193.  
  194. FlushClose:
  195.  
  196.     ARG    FileP,DWORD,1
  197.  
  198.     ENTRY    WINFAR
  199.     LES    DI,FileP
  200.     CMP    ES:[DI].fMode,fmInput
  201.     JE    @@2
  202.     CMP    ES:[DI].fMode,fmOutput
  203.     JE    @@1
  204.     MOV    InOutRes,103
  205.     JMP    SHORT @@3
  206. @@1:    PUSH    AX
  207.     MOV    BX,OFFSET fInOutProc
  208.     CALL    DoFunction
  209.     POP    AX
  210. @@2:    OR    AL,AL
  211.     JE    @@3
  212.     MOV    BX,fCloseProc
  213.     CALL    DoFunction
  214.     MOV    ES:[DI].fMode,fmClosed
  215. @@3:    EXIT
  216.  
  217. ; Do textfile function call
  218.  
  219. DoFunction:
  220.  
  221.     PUSH    ES
  222.     PUSH    DI
  223.     PUSH    ES
  224.     PUSH    DI
  225.     CALL    DWORD PTR ES:[DI+BX]
  226.     OR    AX,AX
  227.     JE    @@1
  228.     MOV    InOutRes,AX
  229. @@1:    POP    DI
  230.     POP    ES
  231.     RET
  232.  
  233. ; Standard textfile read procedure
  234.  
  235. FileRead:
  236.  
  237.     MOV    BX,SP
  238.     PUSH    DS
  239.     LES    DI,SS:[BX+4]
  240.     LDS    DX,ES:[DI].fBufPtr
  241.     MOV    CX,ES:[DI].fBufSize
  242.     MOV    BX,ES:[DI].fHandle
  243.     MOV    AH,dosRead
  244.     INT    DOS
  245.     JC    @@2
  246.     MOV    ES:[DI].fBufEnd,AX
  247.     XOR    AX,AX
  248. @@1:    MOV    ES:[DI].fBufPos,0
  249.     POP    DS
  250.     RETF    4
  251. @@2:    MOV    ES:[DI].fBufEnd,0
  252.     JMP    SHORT @@1
  253.  
  254. ; Standard textfile disk write procedure
  255.  
  256. FileWrite:
  257.  
  258.     MOV    BX,SP
  259.     PUSH    DS
  260.     LES    DI,SS:[BX+4]
  261.     LDS    DX,ES:[DI].fBufPtr
  262.     XOR    CX,CX
  263.     XCHG    CX,ES:[DI].fBufPos
  264.     MOV    BX,ES:[DI].fHandle
  265.     MOV    AH,dosWrite
  266.     INT    DOS
  267.     JC    @@1
  268.     SUB    AX,CX
  269.     JE    @@1
  270.     MOV    AX,101
  271. @@1:    POP    DS
  272.     RETF    4
  273.  
  274. ; Standard textfile device write procedure
  275.  
  276. FileWrDev:
  277.  
  278.     MOV    BX,SP
  279.     PUSH    DS
  280.     LES    DI,SS:[BX+4]
  281.     LDS    DX,ES:[DI].fBufPtr
  282.     XOR    CX,CX
  283.     XCHG    CX,ES:[DI].fBufPos
  284.     MOV    BX,ES:[DI].fHandle
  285.     MOV    AH,dosWrite
  286.     INT    DOS
  287.     JC    @@1
  288.     XOR    AX,AX
  289. @@1:    POP    DS
  290.     RETF    4
  291.  
  292. ; Standard textfile close procedure
  293.  
  294. FileClose:
  295.  
  296.     MOV    BX,SP
  297.     LES    DI,SS:[BX+4]
  298.     MOV    BX,ES:[DI].fHandle
  299.     CMP    BX,4
  300.     JBE    @@1
  301.     MOV    AH,dosClose
  302.     INT    DOS
  303.     JC    @@2
  304. @@1:    XOR    AX,AX
  305. @@2:    RETF    4
  306.  
  307. CODE    ENDS
  308.  
  309.     END
  310.