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

    UNIT VolFuncs;
    (**) INTERFACE (**)
    USES Dos;
    TYPE
      VolString = String[12];

      FUNCTION GetLabel(driveNum : Byte;
                        VAR V : VolString) : Boolean;
      FUNCTION SetLabel(driveNum : Byte;
                        NuLabel : VolString) : Boolean;
      FUNCTION DelLabel(driveNum : Byte) : Boolean;

    (**) IMPLEMENTATION (**)
    TYPE
      ExFCB = RECORD
                FF        : Byte;              {must be 0FFh}
                Reserved0 : ARRAY[1..5] OF Byte; {must be 0s}
                Attribute : Byte;
                DriveID   : Byte;
                Filename  : ARRAY[1..8] OF Char;
                Extension : ARRAY[1..3] OF Char;
                CurBlock  : Word;
                RecSize   : Word;
                FileSize  : LongInt;
                Date      : Word;
                Time      : Word;
                Reserved  : ARRAY[1..8] OF Byte;
                CurRec    : Byte;
                Relative  : LongInt;
              END;

      FUNCTION GetLabel(driveNum : Byte;
                        VAR V : VolString) : Boolean;
      CONST
        Any : String[5] = ':\*.*';
      VAR
        SR   : SearchRec;
        Mask : PathStr;
        P    : Byte;
      BEGIN
        IF DriveNum > 0 THEN
          Mask[1] := Char(DriveNum + ord('@'))
        ELSE GetDir(0, Mask);
        Move(Any[1], Mask[2], 5);
        Mask[0] := #6;
        FindFirst(Mask, VolumeID, SR);
        WHILE (SR.Attr AND VolumeID = 0) AND
              (DosError = 0) DO
          FindNext(SR);
        IF DosError = 0 THEN
          BEGIN
            FillChar(V[1], 11, ' ');
            V[0] := #11;
            P := Pos('.', SR.Name);
            IF P = 0 THEN
              Move(SR.Name[1], V[1], length(SR.Name))
            ELSE
              BEGIN
                Move(SR.Name[1], V[1], pred(P));
                Move(SR.Name[P+1], V[9], length(SR.Name)-P);
              END;
            GetLabel := TRUE;
          END
        ELSE GetLabel := FALSE;
      END;

      FUNCTION SetLabel(driveNum : Byte;
                        NuLabel : VolString) : Boolean;
      VAR E  : ExFCB;
      BEGIN
        WITH E DO
          BEGIN
            FF        := $FF;
            FillChar(Reserved0, 5, 0);
            Attribute := VolumeID;
            DriveID   := DriveNum;
            FillChar(FileName, 8, ' ');
            FillChar(Extension, 3, ' ');
            Move(NuLabel[1], Filename, length(NuLabel));
          END;
        ASM
          PUSH DS
          MOV AX, SS
          MOV DS, AX
          LEA DX, E    {point DS:DX at Extended FCB}
          MOV AH, 16h  {create using FCB}
          INT 21h
          INC AL
          MOV @result, AL
          POP DS
        END;
      END;

      FUNCTION DelLabel(driveNum : Byte) : Boolean;
      VAR E   : ExFCB;
      BEGIN
        WITH E DO
          BEGIN
            FF        := $FF;
            FillChar(Reserved0, 5, 0);
            Attribute := VolumeID;
            DriveID   := DriveNum;
            FillChar(FileName, 8, '?');
            FillChar(Extension, 3, '?');
          END;
        ASM
          PUSH DS
          MOV AX, SS
          MOV DS, AX
          LEA DX, E    {point DS:DX at Extended FCB}
          MOV AH, 13h  {delete using FCB}
          INT 21h
          INC AL
          MOV @Result, AL
          POP DS
        END;
      END;
    END.

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