[Back to DRIVES SWAG index] [Back to Main SWAG index] [Original]

    {
     KB> How do get the disk size or the total clusters on a CD-ROM?
    }

     program CD_Info;

     uses crt, dos;

     Type   tReq_Blk = Array[0..255] of Byte;
            tReq_Hdr = Array[0..017] of Word;

     Const  MSCDEX_GETDRIVES  = $1500;
            MSCDEX_GETVERSION = $150C;
            MSCDEX_DRIVER_REQ = $1510;

            MSCDEX_GetSecSize = 7;
            MSCDEX_GetVolSize = 8;

            RAW_DATA          = 1;

     Var    CPU             : Registers;
            Akt, Cnt, First : byte;
            Req_Hdr         : tReq_Hdr;
            Req_Blk         : tReq_Blk;
            SecSize         : word;
            VolBytes        : real;
            VolSize         : LongInt;

     function CallDriver( Var R: Registers ):byte;
     begin
       Intr($2F, R);
       if (R.FLAGS and FCARRY) <> 0
         then CallDriver := R.AL
         else CallDriver := 0;
     end;

     begin
       writeln; writeln;
       writeln(' CD-ROM Info v1.0           (c)  Norbert Igl 1994 ');
       writeln;
       With CPU do
       begin
         FillChar( CPU, Sizeof( CPU ), 0);
         AX := MSCDEX_GETVERSION;
         If CallDriver( CPU ) <> 0 then
         begin
           writeln(' MSCDEX not installed ... ');
           halt(1);
         end
         else begin
           writeln(' MSCDEX Version   : ',Hi(BX),'.',Lo(BX):2 );
         end;

         FillChar( CPU, Sizeof( CPU ), 0);
         AX := MSCDEX_GETDRIVES;
         If CallDriver( CPU ) <> 0 then
         begin
           writeln(' GETDRIVES Error  : ',Lo(AX) );
           halt(2);
         end
         else begin
           Cnt   := BX;
           First := CX;
           write(' Installed Drives : ',Cnt,' ( ');
           write( CHAR( 65+first ),':');
           if Cnt > 1 then
             write(' .. ', CHAR( 64+first+cnt),':');
           writeln(' )');
         end;
         For Akt := First to First+Cnt-1 do
         begin
           FillChar( CPU, Sizeof( CPU ), 0);
           FillChar( Req_Blk, Sizeof( Req_Blk ), 0);
           FillChar( Req_Hdr, Sizeof( Req_Hdr ), 0);

           Req_Hdr[0] := $000D;  { length of req_hdr }
           Req_Hdr[1] := $0003;  { IOCTL_READ }
           Req_Hdr[7] := Ofs(Req_Blk);
           Req_Hdr[8] := Seg(Req_Blk);
           Req_Hdr[9] := $0004;

           Req_Blk[0] := MSCDEX_GetSecSize;

           AX := MSCDEX_DRIVER_REQ;
           CX := Akt;
           ES := SEG( Req_Hdr );
           BX := OFS( Req_Hdr );
           If CallDriver( CPU ) <> 0 then
           begin
             writeln(' GetSecSize Drive(',Char(Akt+65),') Error  : ',Lo(AX) );
           end
           else Move(Req_Blk[2], SecSize, 2);

           FillChar( CPU, Sizeof( CPU ), 0);
           FillChar( Req_Blk, Sizeof( Req_Blk ), 0);
           FillChar( Req_Hdr, Sizeof( Req_Hdr ), 0);

           Req_Hdr[0] := $000D;  { length of req_hdr }
           Req_Hdr[1] := $0003;  { IOCTL_READ }
           Req_Hdr[7] := Ofs(Req_Blk);
           Req_Hdr[8] := Seg(Req_Blk);
           Req_Hdr[9] := $0005;

           Req_Blk[0] := MSCDEX_GetVolSize;;

           AX := MSCDEX_DRIVER_REQ;
           CX := Akt;
           ES := SEG( Req_Hdr );
           BX := OFS( Req_Hdr );
           If CallDriver( CPU ) <> 0 then
           begin
             writeln(' GetVolSize Drive(',Char(Akt+65),') Error  : ',Lo(AX) );
           end
           else Move(Req_Blk[1], VolSize, 4);

           VolBytes := VolSize;
           if VolBytes < 0 then
           begin
             VolSize :=  ( VolSize shr 1 );
             VolBytes := Volsize;
             VolBytes := VolBytes*2;
           end;
           VolBytes := Volbytes * SecSize;
           VolBytes := Volbytes / ( 1024*1024 );
           Writeln(' Disk in Drive ',Char(Akt+65),'  : ',VolBytes:6:2 ,' MB ');
         end;
       end
     end.

[Back to DRIVES SWAG index] [Back to Main SWAG index] [Original]