home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 13 / CDA13.ISO / cdactual / demobin / share / program / Asm / ASM.ZIP / COFREE.ASM < prev    next >
Encoding:
Assembly Source File  |  1983-06-15  |  2.0 KB  |  87 lines

  1.     TITLE    COFREE    - Diskette Contents List - Get Free Space
  2.     SUBTTL    Version    1.0 - June 1983
  3.     PAGE    81,132
  4. ;
  5. CODE    SEGMENT    PARA PUBLIC 'CODE'
  6.     ASSUME    CS:CODE,DS:CODE
  7. ;
  8.     EXTRN    VERS:BYTE,FREE:BYTE
  9. X10000    DW    10000            ;Conversion constants
  10. X1000    DW    1000,100,10
  11. ;
  12.     PUBLIC    GETFRE
  13. GETFRE    PROC    NEAR
  14.     TEST    VERS,1
  15.     JZ    VERS1
  16.     XOR    DL,DL            ;Set for default drive
  17.     MOV    AH,36H
  18.     INT    21H            ;v2.0 -    get free space
  19.     MUL    BX
  20.     MUL    CX            ;AX,DX contains    bytes free
  21.     JMP    VCOM            ;Enter common code
  22. VERS1:    PUSH    DS
  23.     MOV    AH,1BH
  24.     INT    21H            ;v1.x -    get FAT
  25.     XOR    AH,AH
  26.     XCHG    CX,DX            ;CX has    number of units
  27.     MUL    DX            ;Bytes/allocation unit
  28.     PUSH    AX            ;Save
  29.     XOR    AX,AX
  30.     MOV    SI,2            ;First FAT entry
  31. FAT2:    MOV    DI,SI
  32.     SHR    DI,1
  33.     ADD    DI,SI            ;Compute 1 1/2 bytes
  34.     MOV    DI,WORD    PTR [BX+DI]    ;Load FAT entry
  35.     TEST    SI,1            ;See if    odd or even
  36.     JZ    FAT3
  37.     SHR    DI,1
  38.     SHR    DI,1
  39.     SHR    DI,1            ;Adjust    for 12 bits
  40.     SHR    DI,1
  41. FAT3:    AND    DI,0FFFH        ;Three nibbles
  42.     JNZ    FAT4            ;In use, so don't count
  43.     INC    AX
  44. FAT4:    INC    SI            ;Step to next entry
  45.     LOOP    FAT2            ;Loop through FAT
  46.     POP    CX            ;Restore bytes/allocation unit
  47.     MUL    CX            ;Compute total free bytes
  48.     POP    DS            ;Restore program seg reg
  49. VCOM:    MOV    DI,OFFSET FREE        ;Point to output area
  50.     CALL    CONVRT            ;Convert size to ASCII
  51.     RET
  52. GETFRE    ENDP
  53. ;
  54.     PUBLIC    CONVRT
  55. CONVRT    PROC    NEAR            ;Converts 6 digits, zero surpressed
  56.     PUSH    DI            ;Save pointer for later    use
  57.     DIV    X10000            ;Result    range 0-99
  58.     AAM
  59.     OR    AX,'00'            ;Make ASCII
  60.     XCHG    AH,AL
  61.     STOSW                ;Place in image
  62.     MOV    CX,3            ;Convert last four digits
  63.     MOV    SI,OFFSET X1000
  64. DIVLP:    MOV    AX,DX            ;Remainder becomes dividend
  65.     XOR    DX,DX
  66.     DIV    WORD PTR [SI]        ;Power of 10 divide
  67.     OR    AL,'0'            ;Result    range 0-9
  68.     STOSB
  69.     ADD    SI,2
  70.     LOOP    DIVLP
  71.     OR    DL,'0'            ;Last digit in remainder
  72.     MOV    AL,DL
  73.     STOSB
  74.     MOV    CX,5            ;Now zero surpress 5 digits
  75.     POP    DI
  76.     MOV    AL,' '
  77. SUPLP:    CMP    BYTE PTR [DI],'0'
  78.     JNZ    DNECVT            ;Conversion complete
  79.     STOSB                ;Replace leading zero with blank
  80.     LOOP    SUPLP
  81. DNECVT:    RET
  82. CONVRT    ENDP
  83. ;
  84. CODE    ENDS
  85. ;
  86.     END
  87.