Dim Pi As Double
Dim Regs As Registers
Dim DriveNum As Integer

Sub TheDrive_Change ()
Update_Caption
End Sub

Sub Update_Caption ()
D$ = TheDrive.Drive
Caption = UpCase(D$) + ":"
DriveNum = Asc(Caption) - 64
End Sub

Function UpCase (ByVal A$) As String
S% = Asc(A$)
If S% >= 97 And S% <= 122 Then S% = S% - 32
UpCase = Chr$(S%)
End Function

Sub Form_Load ()
FillStyle = Solid
Pi = 4 * Atn(1)
Update_Caption
End Sub

Sub TheTimer_Timer ()
Update_Display
End Sub

Sub Update_Display ()
If WindowState = 1 Then
  Scale (-16, 7)-(16, -1)
Else
  Scale (-20, 8)-(20, -4)
End If
Regs.AX = &H3600
Regs.DX = DriveNum
Regs.DS = 0 ' Insurance against GP faults
Regs.ES = 0
MsDos Regs
If Regs.AX = -1 Then Regs.DX = 0 'Use Regs.DX=0 to flag error
If Regs.DX = 0 Then 'Avoid division by zero
 Fraction = 0
Else
 Clusters& = Regs.DX
 FreeClusters& = Regs.BX
 If Clusters& < 0 Then Clusters& = Clusters& + 65536
 If FreeClusters& < 0 Then FreeClusters& = FreeClusters& + 65536
 Fraction = FreeClusters& / Clusters&
End If
Angle = Pi * Fraction 'The more free space, the larger Angle gets
If Angle = 0 Then Angle = .01!
If Angle < Pi Then
 FillColor = RED
 Circle (0, 0), 12, Black, -Angle, -Pi 'Draw from Angle to Pi
End If
If Angle > .1! Then
 FillColor = WHITE
 Circle (0, 0), 12, Black, -1E-32, -Angle
End If
If WindowState = 0 Then
 CurrentY = 3
Else
 CurrentY = 6
End If

If Regs.DX <> 0 Then
 Legend$ = Format$(Fraction, "##0%")
 If WindowState = 0 Then Legend$ = Legend$ + " Free"
Else
 Legend$ = "Error"
End If
CurrentX = -TextWidth(Legend$) / 2
Print Legend$;
If WindowState = 0 Then
  Legend$ = Format$((CDbl(FreeClusters&) * Regs.AX) * Regs.CX, "#,###,###,###,###") + " Bytes"
  Print
  CurrentX = -TextWidth(Legend$) / 2
  Print Legend$;
End If
End Sub

Sub Form_Paint ()
Update_Display
End Sub

Sub Interval_KeyPress (KeyAscii As Integer)
  Select Case KeyAscii
    Case 13
      KeyAscii = 0
      Reset_Timer
      TheDrive.SetFocus
      Exit Sub
    Case 8
      Exit Sub
    Case Asc("0") To Asc("9")
      If Len(Interval.Text) < 2 Then Exit Sub
    End Select
  KeyAscii = 0
  Beep
End Sub

Sub Interval_LostFocus ()
Reset_Timer
End Sub

Sub Reset_Timer ()
  Interval.Text = LTrim$(RTrim$(Interval.Text))
  If Len(Interval.Text) <> 0 Then
    NewInterval = Val(Interval.Text) * 1000
    If NewInterval <> 0 Then
      If NewInterval <> TheTimer.Interval Then
        TheTimer.Interval = Val(Interval.Text) * 1000
      End If
    End If
  End If
Interval.Text = LTrim$(Str$(TheTimer.Interval / 1000))
End Sub

