home *** CD-ROM | disk | FTP | other *** search
/ Chip 1997 April / Chip_1997-04_cd.bin / prezent / cb / data.z / BLOCKWRI.ASM < prev    next >
Assembly Source File  |  1997-01-16  |  2KB  |  95 lines

  1.  
  2. ; *******************************************************
  3. ; *                            *
  4. ; *     Delphi Runtime Library                          *
  5. ; *                            *
  6. ; *    Copyright (c) 1996 Borland International    *
  7. ; *                            *
  8. ; *******************************************************
  9.  
  10.     INCLUDE    SE.ASM
  11.     INCLUDE    FILEIO.ASM
  12.  
  13.     .386
  14.     .MODEL    FLAT
  15.  
  16.     EXTRN    WriteFile:NEAR, GetLastError:NEAR, SetInOutRes:NEAR
  17.  
  18.     PUBLIC    _BlockWrite
  19.  
  20.     .CODE
  21.  
  22. ;    PROCEDURE _BlockWrite( f: File; buffer: Pointer; recCnt: Longint; VAR result: Longint);
  23.  
  24. _BlockWrite PROC
  25.  
  26. ; ->    EAX    Pointer to file variable
  27. ;    EDX    Pointer to buffer
  28. ;    ECX    Number of records to write
  29. ;    [ESP+4]    Pointer to result or nil
  30.  
  31.     PUSH    EBX
  32.     PUSH    ESI
  33.  
  34.     MOV    EBX,EAX
  35.     MOV    ESI,EDX
  36.  
  37.     MOV    EAX,[EAX].Mode        ; File must be fmOutput or fmInOut
  38.     SUB    EAX,fmOutput
  39.     CMP    EAX,fmInOut-fmOutput
  40.     JA    @@fileNotOpen
  41.  
  42. ;    WriteFile(f.Handle, buffer, recCnt*f.RecSize, @result, Nil);
  43.  
  44.     PUSH    ECX
  45.  
  46.     PUSH    0            ; space for OS result
  47.     MOV    EAX,ESP
  48.  
  49.     PUSH    0            ; pass lpOverlapped
  50.     PUSH    EAX            ; pass @result
  51.  
  52.     MOV    EAX,[EBX].RecSize
  53.     MUL    ECX
  54.     PUSH    EAX            ; pass nNumberOfBytesToRead
  55.  
  56.     PUSH    ESI            ; pass lpBuffer
  57.     PUSH    [EBX].Handle        ; pass hFile
  58.     CALL    WriteFile
  59.     DEC    EAX            ; check EAX = TRUE
  60.     POP    EAX            ; pop result
  61.     POP    ECX
  62.     JNZ    @@error
  63.  
  64.     XOR    EDX,EDX
  65.     DIV    [EBX].RecSize        ; recCnt = result DIV f.RecSize
  66.     MOV    EDX,[ESP+4+8]
  67.     TEST    EDX,EDX
  68.     JE    @@noResult
  69.     MOV    [EDX],EAX
  70. @@exit:
  71.     POP    ESI
  72.     POP    EBX
  73.  
  74.     RET    4
  75.  
  76. @@noResult:
  77.     CMP    EAX,ECX
  78.     JE    @@exit
  79.     MOV    EAX,101
  80.     JMP    @@errExit
  81. @@error:
  82.     CALL    GetLastError
  83. @@errExit:
  84.     CALL    SetInOutRes
  85.     XOR    EAX,EAX
  86.     JMP    @@exit
  87.  
  88. @@fileNotOpen:
  89.     MOV    EAX,103
  90.     JMP    @@errExit
  91.  
  92. _BlockWrite ENDP
  93.  
  94.     END
  95.