' DISKID.BAS    reports disk volume and serial number from boot sector
'
' Author:     Christy Gemmell (christy.gemmell@almac.co.uk)
' Date:       12/4/1992
'
' Captured from alt.lang.basic newsgroup on July 20, 1995 and converted
' to PowerBASIC by Dave Navarro, Jr. (dave@powerbasic.com)
'
%AX = 1
%BX = 1
%CX = 1
%DX = 1
%DS = 8 

TYPE ParaBlock
  Info  AS INTEGER                ' Call information level
  SerNo AS LONG                   ' Disk serial number
  Label AS STRING * 11            ' Volume label
  FlSys AS STRING * 8             ' File system type
END TYPE

INPUT "Which drive - <Enter> for default"; D$
 GetDiskID D$, S$, V$, F$
  PRINT
  PRINT "Disk information for drive "; D$
  PRINT "----------------------------"
  PRINT "Volume label  : "; V$
  PRINT "Serial number : "; S$
  PRINT "File system   : "; F$
 END

SUB GetDiskID (Drive$, Serial$, Volume$, FileSys$)
  DIM Para AS ParaBlock               ' Buffer for drive parameter block
  Para.Info = 0                       ' Information level always zero
  REG %AX, &H440D                     ' Generic IOCTL device request
  IF Drive$ = "" THEN                 ' If no drive specified
    REG %BX, 0                        '    then use default
  ELSE                                ' Otherwise convert
    REG %BX, ASC(UCASE$(Drive$)) - 64 ' drive letter to number
  END IF                              '     A: = 1, B: = 2 etc
  REG %CX, &H0866                     ' Subfunction: get drive ID
  REG %DX, VARPTR(para)               ' Offset of buffer in DX
  REG %DS, VARSEG(Para)               ' Segment of buffer in DS
  CALL INTERRUPT &H21                 ' Invoke DOS
  Serial$ = HEX$(Para.SerNo)          ' Get serial number
  Volume$ = Para.Label                ' Get volume label
  FileSy$ = Para.FlSys                ' Get file system type
END SUB

