home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / turbo55 / tp55 / bufstm.asm < prev    next >
Assembly Source File  |  1989-05-02  |  5KB  |  219 lines

  1. ; Turbo Pascal 5.5 object-oriented example
  2. ; Assembler code for OBJECTS.PAS unit
  3. ; Copyright (c) 1989 by Borland International, Inc.
  4.  
  5.         TITLE   BUFSTM
  6.  
  7.         INCLUDE OBJECTS.INC
  8.  
  9. CODE    SEGMENT BYTE PUBLIC
  10.  
  11.         EXTRN   StreamError:NEAR
  12.         EXTRN   DosStream@GetPos:NEAR
  13.  
  14.         ASSUME  CS:CODE
  15.  
  16.         PUBLIC  BufStream@Flush
  17.  
  18. BufStream@Flush  PROC   FAR
  19.  
  20. @Self           EQU     (DWORD PTR [BP+6])
  21.  
  22.         PUSH    BP
  23.         MOV     BP,SP
  24.         LES     DI,@Self
  25.         CMP     ES:[DI].Stream@Status,0
  26.         JNE     @@1
  27.         MOV     AL,2
  28.         CALL    FlushBuffer
  29. @@1:    POP     BP
  30.         RET     4
  31.  
  32. BufStream@Flush  ENDP
  33.  
  34.         PUBLIC  BufStream@GetPos
  35.  
  36. BufStream@GetPos  PROC  FAR
  37.  
  38. @Self           EQU     (DWORD PTR [BP+6])
  39.  
  40.         PUSH    BP
  41.         MOV     BP,SP
  42.         LES     DI,@Self
  43.         PUSH    ES
  44.         PUSH    DI
  45.         PUSH    CS
  46.         CALL    DosStream@GetPos
  47.         OR      DX,DX
  48.         JS      @@1
  49.         LES     DI,@Self
  50.         SUB     AX,ES:[DI].BufStream@BufEnd
  51.         SBB     DX,0
  52.         ADD     AX,ES:[DI].BufStream@BufPtr
  53.         ADC     DX,0
  54. @@1:    POP     BP
  55.         RET     4
  56.  
  57. BufStream@GetPos  ENDP
  58.  
  59.         PUBLIC  BufStream@Read
  60.  
  61. BufStream@Read  PROC    FAR
  62.  
  63. @Buf            EQU     (DWORD PTR [BP+12])
  64. @Count          EQU     (WORD PTR [BP+10])
  65. @Self           EQU     (DWORD PTR [BP+6])
  66.  
  67.         PUSH    BP
  68.         MOV     BP,SP
  69.         LES     DI,@Self
  70.         CMP     ES:[DI].Stream@Status,0
  71.         JNE     @@6
  72.         MOV     AL,1
  73.         CALL    FlushBuffer
  74.         JNE     @@6
  75.         XOR     DX,DX
  76. @@1:    MOV     CX,@Count
  77.         SUB     CX,DX
  78.         JE      @@7
  79.         LES     DI,@Self
  80.         MOV     AX,ES:[DI].BufStream@BufEnd
  81.         SUB     AX,ES:[DI].BufStream@BufPtr
  82.         JA      @@2
  83.         PUSH    CX
  84.         PUSH    DX
  85.         PUSH    DS
  86.         LDS     DX,ES:[DI].BufStream@Buffer
  87.         MOV     CX,ES:[DI].BufStream@BufSize
  88.         MOV     BX,ES:[DI].DosStream@Handle
  89.         MOV     AH,3FH
  90.         INT     21H
  91.         POP     DS
  92.         POP     DX
  93.         POP     CX
  94.         JC      @@5
  95.         MOV     ES:[DI].BufStream@BufPtr,0
  96.         MOV     ES:[DI].BufStream@BufEnd,AX
  97.         OR      AX,AX
  98.         JE      @@4
  99. @@2:    CMP     CX,AX
  100.         JB      @@3
  101.         MOV     CX,AX
  102. @@3:    PUSH    DS
  103.         LDS     SI,ES:[DI].BufStream@Buffer
  104.         ADD     SI,ES:[DI].BufStream@BufPtr
  105.         ADD     ES:[DI].BufStream@BufPtr,CX
  106.         LES     DI,@Buf
  107.         ADD     DI,DX
  108.         ADD     DX,CX
  109.         CLD
  110.         REP     MOVSB
  111.         POP     DS
  112.         JMP     @@1
  113. @@4:    MOV     AX,101
  114. @@5:    CALL    StreamError
  115. @@6:    LES     DI,@Buf
  116.         MOV     CX,@Count
  117.         XOR     AL,AL
  118.         CLD
  119.         REP     STOSB
  120. @@7:    POP     BP
  121.         RET     10
  122.  
  123. BufStream@Read  ENDP
  124.  
  125.         PUBLIC  BufStream@Write
  126.  
  127. BufStream@Write  PROC   FAR
  128.  
  129. @Buf            EQU     (DWORD PTR [BP+12])
  130. @Count          EQU     (WORD PTR [BP+10])
  131. @Self           EQU     (DWORD PTR [BP+6])
  132.  
  133.         PUSH    BP
  134.         MOV     BP,SP
  135.         LES     DI,@Self
  136.         CMP     ES:[DI].Stream@Status,0
  137.         JNE     @@4
  138.         MOV     AL,0
  139.         CALL    FlushBuffer
  140.         JNE     @@4
  141.         XOR     DX,DX
  142. @@1:    MOV     CX,@Count
  143.         SUB     CX,DX
  144.         JE      @@4
  145.         LES     DI,@Self
  146.         MOV     AX,ES:[DI].BufStream@BufSize
  147.         SUB     AX,ES:[DI].BufStream@BufPtr
  148.         JA      @@2
  149.         PUSH    CX
  150.         PUSH    DX
  151.         MOV     AL,1
  152.         CALL    FlushBuffer
  153.         POP     DX
  154.         POP     CX
  155.         JNE     @@4
  156.         MOV     AX,ES:[DI].BufStream@BufSize
  157. @@2:    CMP     CX,AX
  158.         JB      @@3
  159.         MOV     CX,AX
  160. @@3:    PUSH    DS
  161.         MOV     AX,ES:[DI].BufStream@BufPtr
  162.         ADD     ES:[DI].BufStream@BufPtr,CX
  163.         LES     DI,ES:[DI].BufStream@Buffer
  164.         ADD     DI,AX
  165.         LDS     SI,@Buf
  166.         ADD     SI,DX
  167.         ADD     DX,CX
  168.         CLD
  169.         REP     MOVSB
  170.         POP     DS
  171.         JMP     @@1
  172. @@4:    POP     BP
  173.         RET     10
  174.  
  175. BufStream@Write  ENDP
  176.  
  177. ; Flush stream buffer
  178. ; In    AL    = Flush mode (0=Read,1=Write,2=Both)
  179. ;       ES:DI = BufStream pointer
  180. ; Out   ZF    = Status test
  181.  
  182. FlushBuffer     PROC    NEAR
  183.  
  184.         MOV     CX,ES:[DI].BufStream@BufPtr
  185.         SUB     CX,ES:[DI].BufStream@BufEnd
  186.         JE      @@4
  187.         MOV     BX,ES:[DI].DosStream@Handle
  188.         JA      @@1
  189.         CMP     AL,1
  190.         JE      @@4
  191.         MOV     DX,CX
  192.         MOV     CX,-1
  193.         MOV     AX,4201H
  194.         INT     21H
  195.         JMP     SHORT @@3
  196. @@1:    CMP     AL,0
  197.         JE      @@4
  198.         PUSH    DS
  199.         LDS     DX,ES:[DI].BufStream@Buffer
  200.         MOV     AH,40H
  201.         INT     21H
  202.         POP     DS
  203.         JC      @@2
  204.         CMP     AX,CX
  205.         JE      @@3
  206.         MOV     AX,101
  207. @@2:    CALL    StreamError
  208. @@3:    XOR     AX,AX
  209.         MOV     ES:[DI].BufStream@BufPtr,AX
  210.         MOV     ES:[DI].BufStream@BufEnd,AX
  211.         CMP     AX,ES:[DI].Stream@Status
  212. @@4:    RET
  213.  
  214. FlushBuffer     ENDP
  215.  
  216. CODE    ENDS
  217.  
  218.         END
  219.