home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wunderki.zip / TGPC.ASM < prev    next >
Assembly Source File  |  1993-08-16  |  4KB  |  290 lines

  1.  
  2. ; *******************************************************
  3. ; *                            *
  4. ; *    Turbo Pascal Runtime Library            *
  5. ; *    Textfile Low-level I/O                *
  6. ; *                            *
  7. ; *    Copyright (C) 1988,92 Borland International    *
  8. ; *                            *
  9. ; *******************************************************
  10.  
  11.     TITLE    TGPC
  12.  
  13.     INCLUDE    SE.ASM
  14.  
  15. CONST    SEGMENT    WORD PUBLIC
  16.  
  17. ; Newline string
  18.  
  19. NewLineStr    DB    cr,lf
  20.  
  21. CONST    ENDS
  22.  
  23. DATA    SEGMENT    WORD PUBLIC
  24.  
  25. ; Externals
  26.  
  27.     EXTRN    InOutRes:WORD
  28.  
  29. DATA    ENDS
  30.  
  31. DGROUP    GROUP    CONST,DATA
  32.  
  33. CODE    SEGMENT    BYTE PUBLIC
  34.  
  35.     ASSUME    CS:CODE,DS:DGROUP
  36.  
  37. ; Publics
  38.  
  39.     PUBLIC    ReadLine,ReadEnd,WriteLine,WriteEnd
  40.     PUBLIC    ReadText,WriteBuffer,WriteBlanks,InOutProc
  41.  
  42. ; Read from textfile
  43. ; In    AX    = Callback procedure pointer
  44. ;    CX    = Callback CX
  45. ;    DX:DI = Callback ES:DI
  46. ;    ES:BX = File pointer
  47. ; Out    ZF    = 1 if no error
  48.  
  49. ReadText:
  50.  
  51.     CMP    InOutRes,0
  52.     JNE    @@2
  53.     CMP    ES:[BX].fMode,fmInput
  54.     JNE    @@3
  55.     MOV    SI,ES:[BX].fBufPos
  56.     CMP    SI,ES:[BX].fBufEnd
  57.     JE    @@4
  58. @@1:    PUSH    DS
  59.     PUSH    ES
  60.     PUSH    BX
  61.     PUSH    DX
  62.     LDS    DX,ES:[BX].fBufPtr
  63.     MOV    BX,ES:[BX].fBufEnd
  64.     POP    ES
  65.     ADD    BX,DX
  66.     ADD    SI,DX
  67.     CLD
  68.     CALL    AX
  69.     SUB    SI,DX
  70.     MOV    DX,ES
  71.     POP    BX
  72.     POP    ES
  73.     POP    DS
  74.     MOV    ES:[BX].fBufPos,SI
  75.     OR    AX,AX
  76.     JNE    @@4
  77. @@2:    RET
  78. @@3:    MOV    InOutRes,104
  79.     RET
  80. @@4:    PUSH    AX
  81.     PUSH    CX
  82.     PUSH    DX
  83.     PUSH    DI
  84.     PUSH    ES
  85.     PUSH    BX
  86.     CALL    InOutProc
  87.     POP    BX
  88.     POP    ES
  89.     POP    DI
  90.     POP    DX
  91.     POP    CX
  92.     POP    AX
  93.     MOV    SI,ES:[BX].fBufPos
  94.     CMP    SI,ES:[BX].fBufEnd
  95.     JNE    @@1
  96.     RET
  97.  
  98. ; Write blanks to textfile
  99. ; In    DX    = Count
  100. ;    ES:BX = File pointer
  101. ; Out    ZF    = 1 if no error
  102.  
  103. WriteBlanks:
  104.  
  105.     CMP    InOutRes,0
  106.     JNE    @@4
  107.     CMP    ES:[BX].fMode,fmOutput
  108.     JNE    @@5
  109. @@1:    MOV    CX,ES:[BX].fBufSize
  110.     MOV    DI,ES:[BX].fBufPos
  111.     SUB    CX,DI
  112.     SUB    DX,CX
  113.     JAE    @@2
  114.     ADD    CX,DX
  115.     XOR    DX,DX
  116. @@2:    PUSH    ES
  117.     LES    SI,ES:[BX].fBufPtr
  118.     ADD    DI,SI
  119.     MOV    AL,' '
  120.     CLD
  121.     REP    STOSB
  122.     SUB    DI,SI
  123.     POP    ES
  124.     MOV    ES:[BX].fBufPos,DI
  125.     CMP    DI,ES:[BX].fBufSize
  126.     JNE    @@3
  127.     PUSH    DX
  128.     PUSH    ES
  129.     PUSH    BX
  130.     CALL    InOutProc
  131.     POP    BX
  132.     POP    ES
  133.     POP    DX
  134. @@3:    OR    DX,DX
  135.     JNE    @@1
  136. @@4:    RET
  137. @@5:    MOV    InOutRes,105
  138.     RET
  139.  
  140. ; Write buffer to textfile
  141. ; In    AX    = Count
  142. ;    DX:SI = Buffer pointer
  143. ;    ES:BX = File pointer
  144. ; Out    ZF    = 1 if no error
  145.  
  146. WriteBuffer:
  147.  
  148.     CMP    InOutRes,0
  149.     JNE    @@4
  150.     CMP    ES:[BX].fMode,fmOutput
  151.     JNE    @@5
  152. @@1:    MOV    CX,ES:[BX].fBufSize
  153.     MOV    DI,ES:[BX].fBufPos
  154.     SUB    CX,DI
  155.     SUB    AX,CX
  156.     JAE    @@2
  157.     ADD    CX,AX
  158.     XOR    AX,AX
  159. @@2:    PUSH    DS
  160.     PUSH    ES
  161.     PUSH    BX
  162.     MOV    DS,DX
  163.     LES    BX,ES:[BX].fBufPtr
  164.     ADD    DI,BX
  165.     CLD
  166.     REP    MOVSB
  167.     SUB    DI,BX
  168.     POP    BX
  169.     POP    ES
  170.     POP    DS
  171.     MOV    ES:[BX].fBufPos,DI
  172.     CMP    DI,ES:[BX].fBufSize
  173.     JNE    @@3
  174.     PUSH    AX
  175.     PUSH    DX
  176.     PUSH    SI
  177.     PUSH    ES
  178.     PUSH    BX
  179.     CALL    InOutProc
  180.     POP    BX
  181.     POP    ES
  182.     POP    SI
  183.     POP    DX
  184.     POP    AX
  185. @@3:    OR    AX,AX
  186.     JNE    @@1
  187. @@4:    RET
  188. @@5:    MOV    InOutRes,105
  189.     RET
  190.  
  191. ; ReadLn standard procedure
  192.  
  193. ReadLine:
  194.  
  195.     ARG    FileP,DWORD,1
  196.  
  197.     ENTRY    WINFAR
  198.     LES    BX,FileP
  199.     MOV    AX,OFFSET CS:@@10
  200.     XOR    DX,DX
  201.     CALL    ReadText
  202.     JNE    @@1
  203.     CMP    ES:[BX].fFlushProc.seg,0
  204.     JE    @@1
  205.     CALL    FlushProc
  206. @@1:    EXIT
  207. @@10:    LODSB
  208.     CMP    AL,cr
  209.     JE    @@11
  210.     CMP    AL,eof
  211.     JE    @@13
  212.     CMP    SI,BX
  213.     JNE    @@10
  214.     MOV    AX,OFFSET CS:@@10
  215.     RET
  216. @@11:    CMP    SI,BX
  217.     JE    @@15
  218. @@12:    LODSB
  219.     CMP    AL,lf
  220.     JE    @@14
  221. @@13:    DEC    SI
  222. @@14:    XOR    AX,AX
  223.     RET
  224. @@15:    MOV    AX,OFFSET CS:@@12
  225.     RET
  226.  
  227. ; WriteLn standard procedure
  228.  
  229. WriteLine:
  230.  
  231.     ARG    FileP,DWORD,1
  232.  
  233.     ENTRY    WINFAR
  234.     LES    BX,FileP
  235.     MOV    AX,2
  236.     MOV    SI,OFFSET DS:NewLineStr
  237.     MOV    DX,DS
  238.     CALL    WriteBuffer
  239.     JNE    @@1
  240.     CMP    ES:[BX].fFlushProc.seg,0
  241.     JE    @@1
  242.     CALL    FlushProc
  243. @@1:    EXIT
  244.  
  245. ; End of Read or Write
  246.  
  247. ReadEnd:
  248. WriteEnd:
  249.  
  250.     ARG    FileP,DWORD,1
  251.  
  252.     ENTRY    WINFAR
  253.     LES    BX,FileP
  254.     CMP    ES:[BX].fFlushProc.seg,0
  255.     JE    @@1
  256.     CMP    InOutRes,0
  257.     JNE    @@1
  258.     CALL    FlushProc
  259. @@1:    EXIT
  260.  
  261. ; Call textfile InOutProc
  262. ; In    ES:BX = File pointer
  263.  
  264. InOutProc:
  265.  
  266.     PUSH    ES
  267.     PUSH    BX
  268.     CALL    ES:[BX].fInOutProc
  269.     OR    AX,AX
  270.     JE    @@1
  271.     MOV    InOutRes,AX
  272. @@1:    RET
  273.  
  274. ; Call textfile FlushProc
  275. ; In    ES:BX = File pointer
  276.  
  277. FlushProc:
  278.  
  279.     PUSH    ES
  280.     PUSH    BX
  281.     CALL    ES:[BX].fFlushProc
  282.     OR    AX,AX
  283.     JE    @@1
  284.     MOV    InOutRes,AX
  285. @@1:    RET
  286.  
  287. CODE    ENDS
  288.  
  289.     END
  290.