home *** CD-ROM | disk | FTP | other *** search
/ Phoenix CD 2.0 / Phoenix_CD.cdr / 11a / cover20.zip / COFREE.ASM < prev    next >
Assembly Source File  |  1991-01-21  |  3KB  |  130 lines

  1.     PAGE    ,132
  2.     TITLE    COFREE  -  Diskette contents list  -  Get Free Space
  3.     COMMENT        * Version 1.0  -  June 1983
  4.             (PER Dr. Dobbs Journal, January, 1984, #87)
  5.             (Dan Daetwyler "Sorted Diskette Directory for
  6.                  the IBM PC")
  7.  
  8.         Version 2.0       Bruce F. Cameron
  9.                   Cincinnati  OH 
  10.  
  11.            February 25, 1985
  12.  
  13.     Counts hidden files
  14.     Grouped sort (i.e. all COM files first etc.)
  15.     Includes Volume Label and Directory (if not root)
  16.     Lists Subdirectory names
  17.     Free space up to 100M (hard disk)  *
  18. ;
  19. ;
  20.     PAGE    82
  21. ;
  22. CODE    SEGMENT    PARA PUBLIC 'CODE'
  23.     ASSUME    CS:CODE, DS:CODE
  24. ;
  25.     EXTRN    EXTND:BYTE, ATRB:BYTE
  26.     EXTRN    VERS:BYTE, FREE:BYTE
  27.     EXTRN    VOLUME:BYTE
  28. X10000    DW    10000            ; Conversion constants
  29. X1000    DW    1000,100,10
  30. ;
  31.     PUBLIC    GETFRE
  32. GETFRE    PROC    NEAR
  33.     TEST    VERS,1
  34.     JZ    VERS1            ; Jump if DOS 1.x
  35.     MOV    AL,' '
  36.     MOV    CX,11
  37.     MOV    DI,OFFSET VOLUME
  38.     REP    STOSB            ; Clear volume label area
  39.     MOV    DX,OFFSET EXTND
  40.     MOV    ATRB,08H        ; Set to search for volume label
  41.     MOV    AH,11H
  42.     INT    21H
  43.     CMP    AL,0FFH
  44.     JE    SHORT SPACE        ; No volume, just fetch space
  45.     MOV    SI,88H            ; Volume label in DTA
  46.     MOV    DI,OFFSET VOLUME
  47.     MOV    CX,11
  48.     REP    MOVSB            ; Move to label field
  49. SPACE:    XOR    DL,DL            ; Set for default drive
  50.     MOV    AH,36H
  51.     INT    21H            ; DOS 2.0 - get free space
  52.     MUL    BX
  53.     MUL    CX            ; AX, DX contain bytes free
  54.     JMP    VCOM            ; Enter common code
  55. ;
  56. VERS1:    PUSH    DS
  57.     MOV    AH,1BH
  58.     INT    21H            ; DOS 1.x - get FAT
  59.     XOR    AH,AH
  60.     XCHG    CX,DX            ; CX has number of items in FAT
  61.     MUL    DX            ; Bytes / allocation unit
  62.     PUSH    AX            ; Save
  63.     XOR    AX,AX            ; Counter for free units
  64.     MOV    SI,2            ; First FAT entry
  65. FAT2:    MOV    DI,SI
  66.     SHR    DI,1
  67.     ADD    DI,SI            ; Multiply by 1 1/2
  68.     MOV    DI,WORD PTR [BX+DI]    ; Load FAT entry
  69.     TEST    SI,1
  70.     JZ    FAT3            ; Even entry
  71.     SHR    DI,1
  72.     SHR    DI,1            ; Odd, 12 bits on left, shift right
  73.     SHR    DI,1
  74.     SHR    DI,1
  75. FAT3:    AND    DI,0FFFH        ; Isolate three nibbles
  76.     JNZ    FAT4            ; In use, don't count
  77.     INC    AX
  78. FAT4:    INC    SI            ; Step to next entry
  79.     LOOP    FAT2
  80.     POP    CX            ; Recall bytes / allocation unit
  81.     MUL    CX            ; Compute total free bytes
  82.     POP    DS            ; Restore program seg reg
  83. VCOM:    MOV    DI,OFFSET FREE
  84.     CALL    CONVRT            ; Size to ASCII, put to output (DI)
  85.     RET
  86. GETFRE    ENDP
  87. ;
  88.     PUBLIC    CONVRT
  89. CONVRT    PROC    NEAR            ; Converts 8 digits, zero suppressed
  90.     PUSH    DI
  91.     DIV    X10000            ; Result 0-99
  92.     PUSH    DX            ; Save remainder
  93.     XOR    DX,DX
  94.     DIV    X1000+2            ; Result up to 4 digits
  95.     AAM
  96.     OR    AX,'00'            ; Make ASCII
  97.     XCHG    AH,AL
  98.     STOSW                ; Place into title image
  99.     MOV    AX,DX            ; Interim remainder to process
  100.     AAM
  101.     OR    AX,'00'
  102.     XCHG    AH,AL
  103.     STOSW
  104.     MOV    CX,3            ; Three powers of 10 to go
  105.     MOV    SI,OFFSET X1000
  106.     POP    DX            ; Remainder from stack
  107. DIVLP:    MOV    AX,DX
  108.     XOR    DX,DX
  109.     DIV    WORD PTR [SI]        ; Power of 10 divide
  110.     OR    AL,'0'            ; Result range 0-9
  111.     STOSB
  112.     ADD    SI,2
  113.     LOOP    DIVLP
  114.     OR    DL,'0'            ; Last digit in remainder
  115.     MOV    AL,DL
  116.     STOSB
  117.     MOV    CX,7            ; Zero suppress 7 digits
  118.     POP    DI
  119.     MOV    AL,' '
  120. SUPLP:    CMP    BYTE PTR [DI],'0'
  121.     JNZ    DNECVT            ; Conversion complete
  122.     STOSB
  123.     LOOP    SUPLP
  124. DNECVT:    RET
  125. CONVRT    ENDP
  126. ;
  127. CODE    ENDS
  128. ;
  129.     END
  130. Ü