DISK SIZE

 BBS: Inland Empire Archive
Date: 01-16-93 (14:49)             Number: 354
From: MATT HART                    Refer#: NONE
  To: KEITH WATKINS                 Recvd: NO  
Subj: DISK SIZE                      Conf: (2) Quik_Bas
 KW> Someone had posted code to not only see how much room was left on a disk
 KW> but how big the disk room was in total.  I did not need it then
 KW> but I do now. Would someone repost it?  Thanks.  -Keith

' FREESPAC.BAS  Matt Hart
'
' Start QB or QBX with /L to load the QB.QLB or
' QBX.QLB library
'
' Free disk space with Interrupt 21h Function 36h

    '$INCLUDE:'\BC71\QBX.BI'    ' Replace with your path to
                                ' QBX.BI or QB.BI
    DEFINT A-Z
    DECLARE FUNCTION FreeSpace&(Drv%)

    DIM SHARED InRegs AS RegTypeX
    DIM SHARED OutRegs AS RegTypeX

' ------ Test code
    Drv = ASC(LTRIM$(RTRIM$(COMMAND$))+CHR$(64)) - 64
    IF Drv = 0 THEN D$ = "Current" ELSE D$ = CHR$(Drv+64)
    PRINT D$+" Drive's Free Space is";FreeSpace&(Drv)
    END
' ----------------

FUNCTION FreeSpace&(Drv)
    InRegs.AX = &H3600
    InRegs.DX = Drv
    CALL InterruptX(&H21,InRegs,OutRegs)
    IF OutRegs.AX = &HFFFF THEN
        FreeSpace& = 0&     ' Drive Invalid
    ELSE
        SPC& = OutRegs.AX       ' Sectors per cluster
        IF SPC& < 0& THEN SPC& = 65536& + SPC&
        AVC& = OutRegs.BX       ' Available clusters
        IF AVC& < 0& THEN AVC& = 65536& + AVC&
        BPS& = OutRegs.CX       ' Bytes per sector
        IF BPS& < 0& THEN BPS& = 65536& + BPS&
        FreeSpace& = SPC& * AVC& * BPS&
    ENDIF
END FUNCTION

' DISKSIZE.BAS  Matt Hart
'
' Uses Int 21h Function 1Ch to get the disk size
' DriveNum% is 0 for current drive, or
' A: = 1 to Z: = 26
'
' Added FUNCTION UnSigned& to convert a possible word of greater
' than 32768 to a positive number.

    '$INCLUDE: 'qb.bi'
    DEFINT A-Z
    DECLARE FUNCTION DiskSize&(DriveNum)
    DECLARE FUNCTION UnSigned&(Num)

    DIM SHARED InRegs AS RegTypeX
    DIM SHARED OutRegs AS RegTypeX

    PRINT DiskSize&(0)

    END

FUNCTION DiskSize&(DriveNum)
    InRegs.AX = &H1C00
    InRegs.DX = DriveNum

    CALL InterruptX(&H21, InRegs, OutRegs)

    SecPerClu& = UnSigned&(OutRegs.AX) MOD 256
    BytPerSec& = UnSigned&(OutRegs.CX)
    CluPerDis& = UnSigned&(OutRegs.DX)

    DiskSize& = (SecPerClu& * BytPerSec& * CluPerDis&)
END FUNCTION

FUNCTION UnSigned&(Num)
    IF Num < 0 THEN
        UnSigned& = 65536& + Num
    ELSE
        UnSigned& = Num
    ENDIF
END FUNCTION
---
 * Origin: Midnight Micro!  V.32/REL  (918)451-3306 (1:170/600)
Outer Court
Echo Basic Postings

Books at Amazon:

Back to BASIC: The History, Corruption, and Future of the Language

Hackers: Heroes of the Computer Revolution (including Tiny BASIC)

Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution

The Advent of the Algorithm: The Idea that Rules the World

Moths in the Machine: The Power and Perils of Programming

Mastering Visual Basic .NET