
unit xdos;

Interface
  function  GetVolSerialNo(DriveNo:Byte): string;
  Procedure PutVolSerialNo(DriveNo:Byte;SerialNo:longint);

Implementation
uses dos,crt;

type
  SerNo_type       =
                     record
                     case integer of
                       0: (SerNo1, SerNo2    : word);
                       1: (SerNo              : longint);
                     end;

  DiskSerNoInfo_type = record
                     Infolevel : word;
                     VolSerNo  : SerNo_Type;
                     VolLabel  : array[1..11] of char;
                     FileSys   : array[1..8] of char;
                     end;


function HexDigit(N : Byte) : char;
begin
  if n < 10 then HexDigit := Chr(Ord('0')+n)
  else           HexDigit := Chr(Ord('A') + (n - 10));
end;


function GetVolSerialNo(DriveNo:Byte): string;
var
  ReturnArray                  : DiskSerNoInfo_type;
  Regs                         : Registers;
begin
  with regs do begin
    AX := $440d;
    BL := DriveNo;
    CH := $08;
    CL := $66;
    DS := Seg(ReturnArray);
    DX := Ofs(ReturnArray);
    Intr($21,Regs);
    if (Flags and FCarry)<>0 then GetVolSerialNo := '' else
    with ReturnArray.VolSerNo do
    GetVolSerialNo :=HexDigit(Hi(SerNo2) Div 16) + HexDigit(Hi(SerNo2) Mod 16)
+
                     HexDigit(Lo(SerNo2) Div 16) + HexDigit(Lo(SerNo2) Mod 16)
+
                     HexDigit(Hi(SerNo1) Div 16) + HexDigit(Hi(SerNo1) Mod 16)
+
                     HexDigit(Lo(SerNo1) Div 16) + HexDigit(Lo(SerNo1) Mod 16);
  end;
end;

Procedure PutVolSerialNo(DriveNo:Byte;SerialNo:longint);
var
  ReturnArray                  : DiskSerNoInfo_type;
  Regs                         : Registers;
begin
  with regs do begin
    AX := $440d;
    BL := DriveNo;
    CH := $08;
    CL := $66;
    DS := Seg(ReturnArray);
    DX := Ofs(ReturnArray);
    Intr($21,Regs);
    if (Flags and FCarry)=0 then begin
       ReturnArray.VolSerNo.SerNo := SerialNo;
       AH := $69;
       BL := DriveNo;
       AL := $01;
       DS := Seg(ReturnArray);
       DX := Ofs(ReturnArray);
       Intr($21,Regs);
    end;
  end;
end;

end.
