program konfig;

var
system_type, version_number: byte;
systype, vernum, laufwerk: string[2];
inf1, inf2, inf3: string[60];

type
  regpack = record
             case integer of 
             1:  (ax,bx,cx,dx,bp,si,di,ds,es,flags: integer);
             2:  (al,ah,bl,bh,cl,ch,dl,dh: byte);
            end;

var
  recpack:       regpack;          
    e1, e2 : byte;
    high, low : string[8];
    flop, serie, usernr, currdrive : byte;

type
str8 = string[8];
str2 = string[2];



function bytobit (zahl : byte) : str8;


var  st1, st2, st4, st8, st16, st32, st64, st128 : byte;
     pos1, pos2, pos4, pos8, pos16, pos32, pos64, pos128 : string[8];

begin
 if zahl >= 128 then
  begin
   st128 := 1;
   zahl := zahl - 128;
  end
  else st128 := 0;
 if zahl >= 64 then
  begin
   st64 := 1;
   zahl := zahl - 64;
  end
  else st64 := 0;
 if zahl >= 32 then
  begin
   st32 := 1;
   zahl := zahl - 32;
  end
  else st32 := 0;
 if zahl >= 16 then
  begin
   st16 := 1;
   zahl := zahl - 16;
  end
  else st16 := 0;
 if zahl >= 8 then
  begin
   st8 := 1;
   zahl:= zahl - 8;
  end
   else st8 := 0;
 if zahl >= 4 then
  begin
   st4 := 1;
   zahl := zahl - 4;
  end
   else st4 := 0;
 if zahl >= 2 then
  begin
   st2 := 1;
   zahl := zahl - 2;
  end
  else st2 := 0;
 if zahl = 1
  then st1 := 1;
 if zahl = 0
  then st1 := 0;
 str (st128, pos128);
 str (st64, pos64);
 str (st32, pos32);
 str (st16, pos16);
 str (st8, pos8);
 str (st4, pos4);
 str (st2, pos2);
 str (st1, pos1);
bytobit := pos128+pos64+pos32+pos16+pos8+pos4+pos2+pos1;
end;

function ergebnis : integer;

type
result = record
          AX, BX, CX, BP, SI, DI, DS, ES, Flags: Integer;
         end;

var register: result;

begin
inline ($50/$53/$51/$52/$56/$57/$1E/$06/$FB);
intr ($11, register);
ergebnis := register.ax;

inline ($07/$1F/$5F/$5E/$5A/$59/$5B/$58/$8B/$E5/$D5/$CF);
end;

function extmem: integer;

type
result = record
          AX, BX, CX, BP, SI, DI, DS, ES, Flags: Integer;
         end;

var register: result;


begin
inline ($50/$53/$51/$52/$56/$57/$1E/$06/$FB);
register.ax:=$8800;
intr ($15, register);
extmem:= register.ax;
inline ($07/$1F/$5F/$5E/$5A/$59/$5B/$58/$8B/$E5/$D5/$CF);
end;




function hex (eingabe: byte): str2;
{Konvertiert eine bytelange Dezimalzahl in eine Hexzahl}

var ergebnis: real;
    ganz: real;
    rest: real;
    s1: char;
    s2: char;

begin
ergebnis:= eingabe / 16;
ganz:= int (ergebnis);
if ganz = 0.0 then
   s1:= '0';
if ganz = 1.0 then
   s1:= '1';
if ganz = 2.0 then
   s1:= '2';
if ganz = 3.0 then
   s1:= '3';
if ganz = 4.0 then
   s1:= '4';
if ganz = 5.0 then
   s1:= '5';
if ganz = 6.0 then
   s1:= '6';
if ganz = 7.0 then
   s1:= '7';
if ganz = 8.0 then
   s1:= '8';
if ganz = 9.0 then
   s1:= '9';
if ganz = 10.0 then
   s1:= 'A';
if ganz = 11.0 then
   s1:= 'B';
if ganz = 12.0 then
   s1:= 'C';
if ganz = 13.0 then
   s1:= 'D';
if ganz = 14.0 then
   s1:= 'E';
if ganz = 15.0 then
   s1:= 'F';
rest:= frac(ergebnis);
if rest = 0.0 then
   s2:= '0';
if rest = 0.0625 then
   s2:= '1';
if rest = 0.125 then
   s2:= '2';
if rest = 0.1875 then
   s2:= '3';
if rest = 0.25 then
   s2:= '4';
if rest = 0.3125 then
   s2:= '5';
if rest = 0.375 then
   s2:= '6';
if rest = 0.4375 then
   s2:= '7';
if rest = 0.5 then
   s2:= '8';
if rest = 0.5625 then
   s2:= '9';
if rest = 0.625 then
   s2:= 'A';
if rest = 0.6875 then
   s2:= 'B';
if rest = 0.75 then
   s2:= 'C';
if rest = 0.8125 then
   s2:= 'D';
if rest = 0.875  then
   s2:= 'E';
if rest = 0.9375 then
   s2:= 'F';
hex:= s1+s2;
end;



begin
    recpack.cx:= $000C;
  BDos(recpack);                        { call function }
    system_type:= recpack.ah;
  version_number:= recpack.al;

 systype := hex (system_type);
 vernum := hex (version_number);

  if copy (systype,1,1) = '0' 
   then inf1 := '8080/Z80';
  if copy (systype,1,1) = '1'
   then inf1 := '80x88/80x86';
  if copy (systype,2,1) = '0'
   then inf2 := 'Single User CP/M resp. MP/M';
  if copy (systype,2,1) = '1'
   then inf2 := 'CP/M-Net, network present';
  if copy (systype,2,1) = '2'
   then inf2 := '16 Bit Multi User System';
  if vernum = '00' then inf3 := '1.0 (CP/M 1.0)'
  else
   if vernum = '20' then inf3 := '2.0 (CP/M 2.0)'
  else
   if vernum = '21' then inf3 := '2.1 (CP/M 2.1)'
  else
   if vernum = '22' then inf3 := '2.2 (CP/M 2.2)'
  else
   if vernum = '25' then inf3 := '2.5 (DOS+)'
  else
   if vernum = '28' then inf3 := '2.8 (PCP/M-80)'
  else
   if vernum = '30' then inf3 := '3.0 (MP/M II)'
  else
   if vernum = '31' then inf3 := '3.1 (CP/M-Plus)'
  else
   if vernum = '41' then inf3 := '4.1 (DOSPlus 1 resp. PCP/M-86)'
  else
   if vernum = '60' then inf3 := '6.0 (DOSPlus 2)'
  else inf3 := copy (vernum,1,1)+'.'+copy (vernum,2,1);

 e1 := lo (ergebnis);
 e2 := hi (ergebnis);
 low := bytobit(e1);
 high := bytobit(e2);
 if low[8] <> '0' then
 begin
  if (low[1] = '0') and (low[2] = '0')
  then flop := 1;
  if (low[1] = '0') and (low[2] = '1')
  then flop := 2;
  if (low[1] = '1') and (low[2] = '0')
  then flop := 3;
  if (low[1] = '1') and (low[2] = '1')
  then flop := 4;
 end
 else flop := 0;
 writeln;
 writeln ('Gabytools Configuration Info Version 1.1 for CP/M');
 writeln ('(C)opyright 1999');
 writeln;
 writeln ('Current Configuration of this Computer');
 writeln ('--------------------------------------');
 writeln;
 writeln ('Number of parallel Ports: ',high[2], '.');
  if (high[6] = '0') and (high[7] = '1')
  then serie := 1;
  if (high[6] = '1') and (high[7] = '0')
  then serie := 2;
  if (high[6] = '1') and (high[7] = '1')
  then serie := 3;
  if (high[6] = '0') and (high[7] = '0')
  then serie := 0;
 writeln ('Number of serial Ports: ',serie, '.');
 if (low[2] = '0') and (low[3] = '1')
  then writeln ('Video Mode: 40*25 Characters, Color.');
  if (low[2] = '1') and (low[3] = '0')
  then writeln ('Video Mode: 80*25 Characters, Color.');
  if (low[2] = '1') and (low[3] = '1')
  then writeln ('Video Mode: 80*25 Characters, monochrome.');
 if extmem <> 0
 then writeln ('Extended Memory: ',extmem, 'K.')
 else writeln ('Extended Memory: none or EMS/XMS Manager installed.');
 writeln ('Number of Floppy Drives: ', flop, '.');
 writeln ('CPU Type as reported by OS: ', inf1, '.');
 writeln ('Operating System Type: ', inf2, '.'); 
 writeln ('BIOS Version: ', inf3, '.'); 
    recpack.cx := $0019;
 BDos (recpack);
    currdrive := recpack.al;
    currdrive := currdrive + 65;
    laufwerk := chr (currdrive);
  writeln ('Current Drive is ',laufwerk, ':.');  
    
    recpack.cx:= $0020;
    recpack.dx:= $00ff;
  BDos(recpack);                        
   usernr := recpack.ax;
 writeln ('Current User Area is ',usernr, '.');
end.
 
 writeln;
 end.
