'===========================================================================
' Subject: DETECT IF DRIVE IS READY           Date: Unknown Date           
'  Author: Brian McLaughlin                   Code: PB                     
'  Origin: dave@powerbasic.com              Packet: DISK.ABC
'===========================================================================
' Drive Ready source for PowerBASIC 3.x
' by BRIAN MCLAUGHLIN

$LIB ALL OFF

DEFINT A-Z

DECLARE FUNCTION DriveReady( BYVAL Drive$ )

FOR X = ASC( "A" ) TO ASC( "F" )
  PRINT "Checking...";
  Ready = DriveReady( CHR$( X ))
  PRINT "drive "; CHR$( X );
  IF Ready THEN
    PRINT " ready."
  ELSE
    PRINT " NOT ready."
  END IF
NEXT

'===============================
FUNCTION DriveReady( BYVAL Drive$ ) PUBLIC AS INTEGER
'===============================
' This FUNCTION returns -1 (true) if the drive is ready, or 0 (false),
' if the drive is not ready, or the drive letter is an invalid drive.
' It will NOT recognize a CD-ROM drive as being ready.

  DIM DriveNum AS LOCAL INTEGER
  DIM DriveIsReady AS LOCAL INTEGER

  DriveNum = ( ASC( Drive$ ) OR 32 ) - 97
  DriveIsReady = -1 'assume drive will be ready

  ! push DS
  ! xor  AX, AX
  ! mov  DX, DriveNum     ; zero - based drive numbering used
  ! int  &H13             ; CALL BIOS TO RESET the drive controller
  ! mov  AX, &H401
  ! mov  CX, &H101
  ! mov  DX, DriveNum
  ! int  &H13
  ! mov  AX, &H401
  ! mov  CX, &H101
  ! mov  DX, DriveNum
  ! int  &H13
  ! jnc  DriveOK          ; carry set could be a fixed disk
  ! mov  AH, &H1C         ; so LET us look, USING DOS
  ! mov  DX, DriveNum
  ! inc  DX               ; one - based drive numbering used
  ! int  &H21
  ! cmp  DX, &HFF
  ! je   DriveOK
  ! mov  AX, [BX]
  ! cmp  AX, &HF8
  ! je   DriveOK
  ! mov  DriveIsReady, 0

DriveOK:

  ! pop DS

  DriveReady = DriveIsReady

END FUNCTION
