home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / directry / filefitr / filefitr.asm next >
Assembly Source File  |  1991-11-17  |  18KB  |  394 lines

  1. ;-------------------------------------------------------------------;
  2. ;   FileFitr.asm  v0.13                                 11/17/91    ;
  3. ;-------------------------------------------------------------------;
  4. ; Utility to return an errorlevel based upon a comparison of the    ;
  5. ; size of a file specified on the command line as compared to free  ;
  6. ; diskspace on the specified disk drive.                            ;
  7. ;                                                                   ;
  8. ; Program handles drive_not_ready errors, file_not_found errors,    ;
  9. ; and non-existent_drive_errors. Also, program is smart enough to   ;
  10. ; view filesizes in terms of cluster size of target drive. This     ;
  11. ; ensures that the returned errorlevel is accurate.                 ;
  12. ;                                                                   ;
  13. ;     Syntax:   FileFitr [d:][\path][filename] <drive>              ;
  14. ;                                                                   ;
  15. ; [filename] may contain a drive and/or path specification and      ;
  16. ;            refers to a single file, or a fileset when wildcards   ;
  17. ;            are used.                                              ;
  18. ;                                                                   ;
  19. ; [drive] the disk drive to inspect for freespace and then compare  ;
  20. ;         the file's size against. If not specified, defaults to    ;
  21. ;         current default drive.                                    ;
  22. ;                                                                   ;
  23. ; Errorlevels returned:                                             ;
  24. ;                                                                   ;
  25. ; errorlevel =  0    0 file copies will fit on disk.                ;
  26. ; errorlevel =  1    1 file copies will fit on disk.                ;
  27. ; errorlevel =  2    2 file copies will fit on disk.                ;
  28. ; errorlevel =  3    3 file copies will fit on disk.                ;
  29. ;     ...                                                           ;
  30. ; errorlevel =  10   10 file copies will fit on disk.               ;
  31. ;     ...                                                           ;
  32. ; errorlevel =  163  163 file copies will fit on disk.              ;
  33. ;     ...                                                           ;
  34. ; errorlevel =  249  249 (or more) file copies will fit on disk.    ;
  35. ;     ...                                                           ;
  36. ; errorlevel =  250  reserved for future error                      ;
  37. ; errorlevel =  251  reserved for future error                      ;
  38. ;                                                                   ;
  39. ; errorlevel =  252  source file not found                          ;
  40. ; errorlevel =  253  source drive not ready                         ;
  41. ; errorlevel =  254  target drive not ready                         ;
  42. ; errorlevel =  255  user error / help request                      ;
  43. ;                                                                   ;
  44. ; Notes:                                                            ;
  45. ;  As coded, this program can deal with disks with up to 65,535     ;
  46. ;  free clusters (which might reasonably represent 32mb for 512     ;
  47. ;  byte clusters, up through about 524mb for 8kb clusters. This     ;
  48. ;  should suit the needs of most people. :-)                        ;
  49. ;                                                                   ;
  50. ;  Also, by the same token, this program can only process batches   ;
  51. ;  of files which total less than 65535 clusters. Once again, not   ;
  52. ;  a problem.                                                       ;
  53. ;                                                                   ;
  54. ;-------------------------------------------------------------------;
  55. ; v0.10 10/16/91  initial coding (modification of compsize.asm)     ;
  56. ; v0.11 10/17/91  added full wildcard totalling ability.            ;
  57. ; v0.12 10/18/91  added discrete file/disk error code returns.      ;
  58. ;                 fixed minor bug in chekflop routine.              ;
  59. ; v0.13 11/17/91  added drive reset to chekflop routine (thanks to  ;
  60. ;                 Mark Tutt of FidoNet 1:363/88)                    ;
  61. ;                                                                   ;
  62. ;-------------------------------------------------------------------;
  63. ; <Legal Status>                                                    ;
  64. ;  In the spirit of cooperation and education within the computing  ;
  65. ;  community, and in the hope that someone may benefit:             ;
  66. ;                                                                   ;
  67. ;  This program is released into the Public Domain.                 ;
  68. ;                                                                   ;
  69. ;  Please don't abuse this concept of sharing of information.       ;
  70. ;                                                                   ;
  71. ;-------------------------------------------------------------------;
  72. ; <General Disclaimer>                                              ;
  73. ;  Please note that this program was written for my personal use    ;
  74. ;  and that I am not a professional programmer. Thus, although I    ;
  75. ;  have made every effort to ensure that the code is bug free and   ;
  76. ;  performs as advertised, I can make no guarantees of suitability  ;
  77. ;  or performance - use at your own risk!                           ;
  78. ;                                                                   ;
  79. ;  In any case, this source code is provided for your inspection,   ;
  80. ;  enlightenment, and/or general amusement.                         ;
  81. ;                                                                   ;
  82. ;  I welcome any and all comments, criticisms, suggestions, or bug  ;
  83. ;  reports at the address below.                                    ;
  84. ;                                                                   ;
  85. ;-------------------------------------------------------------------;
  86. ;    Written for and assembled under Microsoft QuickC ver 2.01      ;
  87. ;      (Should also assemble under Masm with no problems)           ;
  88. ;-------------------------------------------------------------------;
  89. ;   Bruce Desmond      Sacramento, Ca.    Fidonet (1:203/39.9)      ;
  90. ;-------------------------------------------------------------------;
  91.  
  92. ; Directives
  93.  
  94. _TEXT    segment word public 'CODE'
  95.          assume  cs:_TEXT, ds:_TEXT
  96.          org     100h
  97.  
  98. ;-------------------------------------------------------------------;
  99. ; Extract [filespec] and [size] from PSP
  100. ;-------------------------------------------------------------------;
  101.  
  102. first:   mov     di,offset fspb      ;initialize dynamic filespec buff
  103.          mov     al,0
  104.          mov     cx,128              ;want 128 bytes of nuls
  105.          rep     stosb
  106.  
  107. ;-------------------------------------------------------------------;
  108. ; Strip off leading spaces and check parms s'more
  109. ;-------------------------------------------------------------------;
  110.  
  111. ffsp:    mov     si,80h              ;if no filespec then show help
  112.          cld
  113.          lodsb                       ;and bail out
  114.          cmp     al,0
  115.          jna     died
  116.  
  117. llup:    mov     dl,[si]             ;get a char
  118.          cmp     dl,13               ;is it a CR? (uhoh!)
  119.          je      died
  120.  
  121.          cmp     dl,32               ;leading space? (trash it)
  122.          jne     gfil
  123.          inc     si
  124.          jmp     llup                ;keep looping until valid char
  125.  
  126. ;-------------------------------------------------------------------;
  127. ; Extract any passed [filespec] from PSP
  128. ;-------------------------------------------------------------------;
  129.  
  130. gfil:    mov     di,0                ;initialize write counter to 0
  131.          mov     bx,offset fspb      ;start of filespec buffer
  132. flup:    mov     dl,[si]             ;get a char
  133.          inc     si
  134.          cmp     dl,13               ;is it a CR?
  135.          je      chkdrv
  136.          cmp     dl,32               ;trailing space? (end of spec)
  137.          je      gots
  138.  
  139. ;wildcard rejection code is right here. uncomment next 4 lines
  140. ;to not permit use of wildcards in filespec.
  141.  
  142. ;         cmp     dl,'*'             ;is it a wildcard?
  143. ;         je      died               ;(Wildcards are verboten)
  144. ;         cmp     dl,'?'             ;is it a wildcard?
  145. ;         je      died
  146.  
  147.          mov     [bx+di],dl          ;write char to data buffer
  148.          inc     di
  149.          jmp     flup
  150.  
  151. gots:    cmp     di,0                ;check again for passed filespec
  152.          ja      zlup
  153.  
  154. ;-------------------------------------------------------------------;
  155. died:    mov     ah,9                ;crashed, burned, mangled beyond 
  156.          mov     dx,offset help      ;recognition. Say "bye-bye"...
  157.          int     21h
  158.          jmp     done
  159.  
  160. ;-------------------------------------------------------------------;
  161. ; Extract any passed [drive] from PSP
  162. ;-------------------------------------------------------------------;
  163.  
  164. zlup:    mov     cl,[si]             ;get a char
  165.          inc     si
  166.  
  167.          cmp     cl,13               ;is it a CR? (done!)
  168.          je      chkdrv
  169.  
  170.          cmp     cl,32               ;leading or trailing space? (skip)
  171.          je      zlup
  172.  
  173.          or      cl,32               ;lowercase it
  174.  
  175.          cmp     cl,97               ;at least an 'a' ?
  176.          jb      died
  177.  
  178.          cmp     cl,122              ;no more than a 'z' ?
  179.          ja      died
  180.  
  181.          mov     nulbuf,cl           ;prepend drive letter to buffer
  182.  
  183.          sub     cl,96               ;resolve to digit (A=1, B=2, etc)
  184.  
  185.          mov     driv,cl             ;store drive letter
  186.  
  187. ;-------------------------------------------------------------------;
  188. ; check if [drive] is drive A or B (a floppy). check drive ready
  189. ;-------------------------------------------------------------------;
  190.  
  191. chkdrv:  mov     di,offset nulbuf    ;check [disk_drive]
  192.          call    chekflop
  193.          jnc     chkfil
  194.          mov     byte ptr [ecode],254  ;load target drive error code
  195.          jmp     done
  196.  
  197. ;-------------------------------------------------------------------;
  198. ; check if [filename] has a drive A or B (a floppy). check drive ready
  199. ;-------------------------------------------------------------------;
  200.  
  201. chkfil:  mov     di,offset fspb      ;check [filename]
  202.          call    chekflop
  203.          jnc     getfsp
  204.          mov     byte ptr [ecode],253  ;load source drive error code
  205.          jmp     short done
  206.  
  207. ;-------------------------------------------------------------------;
  208. ; Get freespace of specified drive
  209. ;-------------------------------------------------------------------;
  210. getfsp:  mov     ah,36h              ;get disk free space
  211.          mov     dl,driv             ;retrieve drive desired
  212.          int     21h
  213.  
  214.          cmp     ax,0ffffh           ;did error occur?
  215.          jne     clusmat
  216.          mov     byte ptr [ecode],254  ;load target drive error code
  217.          jmp     short done          ;bad juju!
  218.  
  219. clusmat: xor     dx,dx               ;byte/clust = sect/clust * byte/sect
  220.          mul     cx                  ;sector/cluster * byte/sector
  221.  
  222.          mov     clsize,ax           ;store cluster size
  223.          mov     freecl,bx           ;store free clusters
  224.  
  225. ;-------------------------------------------------------------------;
  226. ; Search for first file match (trick to check exist and get size)
  227. ;-------------------------------------------------------------------;
  228.  
  229. fndfil:  mov     dx,offset fspb      ;location of filespec
  230.          mov     cx,00000110b        ;any combination of H,S,A,R attribs
  231.          mov     ah,4eh              ;find first match
  232.          int     21h
  233.          jnc     addtot
  234.          mov     byte ptr [ecode],252  ;load file not found error code
  235.          jmp     short done          ;if bad filespec or no files exit
  236.  
  237. addtot:  call    getsize             ;retrieve filesize
  238.          add     sitot,ax            ;lump in returned filesize
  239.  
  240. ;-------------------------------------------------------------------;
  241. ; Search for next file match (trick to check exist and get size)
  242. ;-------------------------------------------------------------------;
  243.  
  244. fndnxt:  mov     ah,4fh              ;find next match
  245.          int     21h
  246.          jc      cmpsize             ;if no more files then finish up
  247.  
  248.          call    getsize             ;retrieve filesize
  249.          add     sitot,ax            ;lump in returned filesize
  250.  
  251.          jmp     short fndnxt
  252.  
  253. ;-------------------------------------------------------------------;
  254. ; Compare filesize total (in sitot) to freespace (in freecl)
  255. ;-------------------------------------------------------------------;
  256.  
  257. cmpsize: mov     bx,sitot            ;retreive clust/file total
  258.  
  259.          cmp     bx,0                ;is filesize zero?
  260.          ja      cmpclu
  261.  
  262.          mov     al,249              ;load return code
  263.          jmp     short prebail
  264.  
  265. cmpclu:  mov     ax,freecl           ;retrieve free clusters
  266.          xor     dx,dx
  267.          div     bx                  ;files_per_disk = freeclust/clus_per_file
  268.  
  269.          cmp     ax,249              ;change any number over 249 to 249
  270.          jna     prebail
  271.          mov     al,249
  272.  
  273. prebail: mov     ecode,al
  274.  
  275. ;-------------------------------------------------------------------;
  276. ; Bail out with errorlevel
  277. ;-------------------------------------------------------------------;
  278.  
  279. done:    mov     al,ecode            ;retreive errorlevel
  280.          mov     ah,04ch             ;exit with errorlevel
  281.          int     21h
  282.  
  283. ;-------------------------------------------------------------------;
  284. ; function getsize     Retrieve found filesize (from DTA).
  285. ;                      Filesize returned in AX
  286. ;-------------------------------------------------------------------;
  287.  
  288. getsize  proc    near
  289.  
  290.          mov     bx,09ah             ;offset in DTA of 4byte filesize
  291.  
  292.          mov     dx,word ptr[bx+2]   ;get high word
  293.          mov     ax,word ptr[bx]     ;get low word
  294.  
  295.          div     clsize              ;clust/file = filesize/clustersize
  296.                                      ;remember that integral clusters are
  297.                                      ;allocated for file storage
  298.  
  299.          cmp     dx,0                ;any leftovers?
  300.          je      norndup
  301.          inc     ax                  ;bump to next even cluster
  302.  
  303. norndup: ret
  304.  
  305. getsize  endp
  306.  
  307.  
  308. ;-------------------------------------------------------------------;
  309. ; function chekflop   check drive in passed string pointed at by di
  310. ;                     returns: CF set if error
  311. ;-------------------------------------------------------------------;
  312. chekflop proc    near
  313.  
  314.          mov     dx,[di]           ;grab first 2 bytes
  315.  
  316.          cmp     dh,':'            ;drive designator?
  317.          jne     nodrive
  318.  
  319.          and     dl,0dfh           ;uppercase
  320.          sub     dl,65             ;drive digit (0-25d)
  321.  
  322.          cmp     dl,1              ;ignore hard disks
  323.          ja      nodrive
  324.  
  325.          mov     cl,1              ;sector 1
  326.          mov     ch,0              ;track 0
  327.          mov     dh,0              ;side 0
  328.  
  329.          mov     ah,4
  330.          int     13h               ;verify sector
  331.  
  332.          jnc     nodrive           ;drive was ok
  333.  
  334.          mov     ah,0              ;reset drive
  335.          int     13h
  336.  
  337.          stc
  338.          ret
  339.  
  340. nodrive: clc
  341.          ret
  342.  
  343. chekflop endp
  344.  
  345. ;-------------------------------------------------------------------;
  346. ; Equates
  347. ;-------------------------------------------------------------------;
  348.  
  349. ;-------------------------------------------------------------------;
  350. ; Data buffer(s)
  351. ;-------------------------------------------------------------------;
  352. nulbuf   db 0,':\nul'                ;target drive check buffer
  353.  
  354. freecl   dw 0                        ;free clusters
  355. clsize   dw 0                        ;cluster size
  356. sitot    dw 0                        ;clusters/file total
  357.  
  358. ecode    db 255                      ;errorlevel to return
  359.  
  360. driv     db 0                        ;default drive number
  361.  
  362. help     db 13,10,13,10
  363.  db 'FileFitr.com v0.13 11/17/91 '
  364.  db 'errorlevel for compare of filesize(s) to freespace',13,10
  365.  db ' Released to the PUBLIC DOMAIN by Bruce Desmond (1:203/39.9)',13,10,13,10
  366.  db 'Syntax:  FileFitr [d:][\path][filename] <drive>',13,10,13,10
  367.  db '[filename] - compare size of file(s) to freespace. If wildcards'
  368.  db 13,10
  369.  db '             (* and/or ?) used, all matches totaled and compared.'
  370.  db 13,10,13,10
  371.  db '<drive> - inspect this drive and compare size[filename] to freespace.'
  372.  db 13,10
  373.  db '          If not specified, current default disk is used.'
  374.  db 13,10,13,10
  375.  db 'Errorlevels:',13,10,13,10
  376.  db '    0 = 0 file copies will fit on disk',13,10
  377.  db '     ...',13,10
  378.  db '  137 = 137 file copies will fit on disk',13,10
  379.  db '     ...',13,10
  380.  db '  249 = 249 (or more) file copies will fit on disk',13,10
  381.  db '     ...',13,10
  382.  db '  250 = reserved                 251 = reserved',13,10
  383.  db '  252 = source file not found    253 = source drive not ready',13,10
  384.  db '  254 = target drive not ready   255 = syntax error or help request'
  385.  db 13,10,'$'
  386.  
  387. fspb     db 0                        ;Dynamic Filespec data buffer
  388.  
  389. ;-------------------------------------------------------------------;
  390.  
  391. _TEXT    ends
  392.          end     first
  393. ;-----------------------------end-of-code---------------------------;
  394.