Contributor: GREG VIGNEAULT           

{
 Below is TP code to do drive-Type identification.  I leave it as a
 research exercise For you to create code to differentiate between
 a RAM drive and fixed disk, if that's needed.

}
(********************************************************************)
 Program DrvCount;                      { coded by Greg Vigneault   }
 Uses   Crt,Dos;                        { For MsDos Function        }
 Var    Drives      :Byte;              { count of logical drives   }
        Reg         :Registers;         { to access CPU Registers   }
        ThisDrive   :Byte;              { loop count                }
        DriveType   :String[16];        { Type of drive found       }
        DataBuffer  :Array [0..127] of Byte;   { buffer For Dos i/o }
 begin
    ClrScr;                             { remove screen clutter     }
    Reg.AH := $19;                      { get current disk code     }
    MsDos(Reg);                         { via Dos                   }
    Reg.DL := Reg.AL;                   { returned drive code       }
    Reg.AH := $E;                       { select disk               }
    MsDos(Reg);                         { via Dos                   }
    Drives := Reg.AL;                   { number of logical drives  }

    WriteLn('Number of logical drives: ', Drives );

    Intr($11,Reg);                      { get system equipment flag }
    if ( (Reg.AX and 1) <> 0 )          { any floppies installed?   }
        then WriteLn('(physical floppy drives: ',
                (Reg.AX SHR 6) and 3, ')' );    { get bits 6&7      }

    For ThisDrive := 1 to Drives do begin   { scan all drives       }
        Reg.AX := $440D;                { using generic I/O control }
        Reg.CX := $860;                 { to get drive parameters   }
        Reg.BL := ThisDrive;            { For this drive            }
        Reg.DX := ofs(DataBuffer);      { Pointer to scratch buffer }
        Reg.DS := Seg(DataBuffer);      {  in is DS:DX              }
        MsDos(Reg);                     { thank you, Dos            }
        Case ( DataBuffer[1] ) of       { which Type it is...       }
            0   : DriveType := '360 KB 5.25" FDD';
            1   : DriveType := '1.2 MB 5.25" FDD';
            2   : DriveType := '720 KB 3.5" FDD';
            3   : DriveType := 'SD 8"'; { a relic from CP/M roots   }
            4   : DriveType := 'DD 8"'; {   ditto                   }
            5   : DriveType := 'Fixed/RAM disk';    { HDD or RAM    }
            6   : DriveType := 'Tape drive';    { a good investment }
            7   : DriveType := '1.44 MB 3.5" FDD'  { or "other" drv }
            else  DriveType := '???';   { anything else             }
            end; { Case }
        WriteLn(' - ', CHR(ThisDrive+64),': (', DriveType, ')' );
        { further code could ID between RAM drive & HDD             }
        end; { For }
 end. { Program }
(********************************************************************)