home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 5 / ctrom5b.zip / ctrom5b / PROGRAM / ASM / ALIB30B / DISKF.ASM < prev    next >
Assembly Source File  |  1994-11-04  |  4KB  |  155 lines

  1.     page    66,132
  2. ;******************************** DISKF.ASM  *********************************
  3.  
  4.  
  5. LIBSEG           segment byte public "LIB"
  6.         assume cs:LIBSEG , ds:nothing
  7.  
  8. ;----------------------------------------------------------------------------
  9. .xlist
  10.     include  mac.inc
  11.  
  12.     extrn    dos_mem_allocate:far
  13.     extrn    dos_mem_release:far
  14. .list
  15. ;----------------------------------------------------------------------------
  16.  
  17. file_handle        dw    0    ;file handle
  18.  
  19. buffer_address    label    dword
  20. buffer_pointer    dw    0
  21. BufferSegment    dw    0
  22.  
  23. BufferSize    equ    8000h
  24. available    dw    0    ;bytes available in buffer
  25.  
  26.  
  27. comment 
  28. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(  DISK   )
  29. ;DiskWrite_open - open disk file for buffer write
  30. ;
  31. ; inputs:  ds:dx = pointer to asciiz file name
  32. ;
  33. ; output:  if no carry - file opened successfully
  34. ;                carry - error, either file can not be opened or
  35. ;                        file is already open.
  36. ;
  37. ;* * * * * * * * * * * * * *
  38. 
  39.     public    DiskWrite_open
  40. DiskWrite_open    proc    far
  41.     apush    ax,cx,dx,es
  42.     cmp    cs:file_handle,0
  43.     jne    error                ;jmp if file already open
  44.     mov    ah,3ch                ;file create
  45.     mov    cx,0                ;create normal read/write
  46.     int    21h
  47.     jc    error                ;jmp if file error
  48.     mov    cs:file_handle,ax
  49.     mov    dx,0
  50.     mov    ax,BufferSize
  51.     call    dos_mem_allocate
  52.     jc    error                ;jmp if insufficient memory
  53.     mov    cs:BufferSegment,es
  54.     mov    cs:buffer_pointer,0
  55.     mov    cs:available,BufferSize
  56.     jmp    do_exit
  57. error:    stc
  58. do_exit:apop    es,dx,cx,ax
  59.     retf
  60.  
  61. DiskWrite_open    endp
  62. ;
  63.  
  64. comment 
  65. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(  DISK   )
  66. ;DiskWrite_buffer - open disk file for buffer write
  67. ;
  68. ; inputs:  ds:dx = pointer to write data
  69. ;             cx = amount of data to write
  70. ;
  71. ; output:  if no carry - file written successfully
  72. ;                carry - error, either file error, or file not open
  73. ;                        or data block exceeds 32000 bytes.
  74. ;
  75. ; note:  DiskWrite_open must be called before this funciton can be
  76. ;        used.  Use DiskWrite_close when done with file.
  77. ;        The largest data block which can be buffered is 32000 bytes.
  78. ;* * * * * * * * * * * * * *
  79. 
  80.     public    DiskWrite_buffer
  81. DiskWrite_buffer    proc    far
  82.     apush    ax,bx,es
  83.     cmp    cs:file_handle,0
  84.     je    db_error
  85.     cmp    cx,cs:available        ;check if room
  86.     jb    db_move            ;jmp if room
  87.     cmp    cx,BufferSize
  88.     ja    db_error        ;jmp if too much data
  89.  
  90.     call    write_buffer
  91.     jc    db_error
  92.     
  93. db_move:apush    cx,si,di
  94.     cld
  95.     sub    cs:available,cx
  96.     mov    si,dx
  97.     les    di,cs:buffer_address
  98.     rep    movsb
  99.     mov    cs:buffer_pointer,di
  100.     apop    di,si,cx
  101.     clc
  102.     jmp    db_exit    
  103. db_error:stc
  104. db_exit:apop    es,bx,ax
  105.     retf
  106.  
  107. DiskWrite_buffer    endp
  108. ;-----------------------------
  109. write_buffer:        
  110.     apush    ds,dx,cx
  111.     mov    bx,cs:file_handle
  112.     mov    ah,40h
  113.     mov    cx,cs:buffer_pointer
  114.     mov    dx,0            ;offset buffer
  115.     mov    ds,cs:BufferSegment
  116.     int    21h
  117.     mov    cs:buffer_pointer,0
  118.     mov    cs:available,BufferSize
  119.     apop    cx,dx,ds
  120.     ret
  121.  
  122. comment 
  123. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(  DISK   )
  124. ;DiskWrite_close - close disk file used for buffer write
  125. ;
  126. ; inputs:  none
  127. ;
  128. ; output:  none
  129. ;
  130. ;* * * * * * * * * * * * * *
  131. 
  132.     public    DiskWrite_close
  133. DiskWrite_close    proc    far
  134.     apush    ax,bx,cx,es
  135.     cmp    cs:file_handle,0
  136.     je    dc_exit            ;jmp if no file open
  137.     mov    cx,cs:buffer_pointer
  138.     jcxz    close_it        ;jmp if buffer empty
  139.     call    write_buffer
  140. close_it:
  141.     mov    bx,cs:file_handle
  142.     mov    ah,3eh            ;close file
  143.     int    21h
  144.     mov    es,cs:BufferSegment
  145.     call    dos_mem_release
  146.     mov    cs:file_handle,0    ;enable diskwrite_open
  147. dc_exit:
  148.     apop    es,cx,bx,ax
  149.     retf    
  150. DiskWrite_close    endp
  151. ;
  152.     
  153. LIBSEG    ENDS
  154.     end
  155.