Извлечение данных из переменной окружения


unit GetSBInf; 
interface

var
   base          :integer;  { базовый адрес ввода-вывода}
   irq           :integer;  { номер IRQ                 }
   dma8          :integer;  { 8-битный канал DMA        }
   dma16         :integer;  { 16-битный канал DMA       }
   midi          :integer;  { порт MIDI                 }
   cardtype      :integer;  { номер типа платы          }

procedure GetBlasterInfo; {извлечение информации о плате}

implementation
uses dos;

var
   s : string; {переменная окружения ?BLASTER?}
   e : byte;   {позиция в этой строке}

function str2hex:word;
        {преобразует последовательность hex-цифр в число}
var
   val : word;
begin
   val := 0;
   inc(e);
   while (s[e] <> ? ?) and (s[e] <> char(0)) and 
                                (e <= length(s)) do begin
      case UpCase(s[e]) of
         ?0?..?9? : val := val * 16
                              + (byte(s[e]) - byte(?0?));
         ?A?..?F? : val := val * 16 
                        + (byte(s[e]) - byte(?A?)  + 10);
         else begin
            writeln(
    ?Ошибка в цифровых параметрах переменной окружения?);
            halt;
         end;
      end;
      inc(e);
   end;
   str2hex := val;
end;

procedure GetBlasterInfo; {информация о плате}
begin
   s := getenv(?BLASTER?);
   e := 1;
   if (length(s)>0) then begin
      while (e < length(s)) do begin
         case UpCase(s[e]) of
            ?A?:base     := str2hex;
            ?I?:irq      := str2hex;
            ?D?:dma8     := str2hex;
            ?H?:dma16    := str2hex;
            ?P?:midi     := str2hex;
            ?T?:cardtype := str2hex;
         end; {case}
         inc(e);
      end; {while}
   end else begin
      writeln(
             ?Отсутствует переменная окружения BLASTER?);
      halt;
   end; {if}
end;

end.