{
I finally got ready my contribution to SWAG. I hope it will be
included in the August release :)

It consists of some software / hardware detection (pci boards, vesa
compliant cards, fpu, game port, xms, emm, 4dos, etc.)

Put it in the section that you think it's more appropiate. I think
HARDWARE would be nice (although it has some software routines) or maybe
MISC. I don't know. It's up to you :)

Anyway, I suppose you will include the appropiate keywords, won't you?

Well, here it is. Maybe I have time to send you some other
contributions for the August release.

 -------- cut ----------- cut ---------- cut ---------- cut ----------
}
program test_system;
uses crt;

{
      ***************************************************************
       This program detects some cool hardware and software stuff
       By Pedro Eisman, CRAMP / Dark Ritual, 1996
       Use it, modify it, etc. Please give credit when necessary ;-)
           Contribute to SWAG, so it will always be so cool!
      ***************************************************************
}

procedure biosdate; {Returns the bios date}
var

l:byte;

begin
     write('Bios date: ');
     for l:=1 to 8 do begin
         write(chr(mem[$f000:$fff4+l]))
     end;

     writeln;

end;



function pci:boolean; {Tells if there is a PCI board
               Returns TRUE if found}

          function ispci:byte;assembler;asm
                   mov ax,0b101h
                   int 01ah
                   mov al,ah
          end;

begin
     if ispci=0 then pci:=true
     else pci:=false;
end;



function detectfpu:boolean; {Detects a coprocessor, not 100% reliable
                             Returns true if found, false if not found}
var

val: byte;

begin
     val:= mem[$0000:$0410];

             if val and 2=2 then detectfpu:=true {Check bit 2}
             else detectfpu:=false;

end;


function detectgame:boolean; {Tells if there is a game card or joystick port
                              Returns TRUE if found}
var
val: byte;

begin
     val:= mem[$0000:$0411];
           if val and 6=6 then detectgame:=true {Check bit 6}
           else detectgame:=false;
end;



function xms:boolean; {Tells if there is an extended memory manager
                       Returns true if found}

         function checkxmm:byte;assembler;asm
                  mov ax,4300h
                  int 2fh
         end;

begin
     if checkxmm=$80 then xms:=true
     else xms:=false;
end;



function emm:boolean;  {Tells if there is an expanded memory manager, EMM386
                        Returns TRUE if found (not tested with QEMM) }
var
l: byte;
e: boolean;

const
name:string[8]='EMMXXXX0'; {We have to look in memory for this string}

         function addressemm:word;assembler;asm {It returns the segment where 
                                        the memory manager resides}
                  mov ax,3567h
                  int 21h
                  mov ax,es
         end;

begin

e:=true;

        for l:=10 to 17 do begin {This is where the string starts}
            if chr(mem[addressemm:l])<>name[l-9] then e:=false; {Compare it}
        end;

emm:=e;

end;


procedure svga; {Checks for a VESA compliant card}

var

infoptr: pointer; {Pointer where the cards gives us its info}
infoseg: word;
s,d: word;
i : byte;
fabric: string;  {Card's manufacturer name}

function isvesa:byte;assembler;asm {Checks if there's a VESA compliant card
                                    and finds where to get allits info}
         mov ax,infoseg
         mov es,ax
         xor di,di
         mov ax,4f00h
         int 10h
         xchg ah,al

end;

begin

     getmem(infoptr,257); {Reserve memory for card's info}
     infoseg:=seg(infoptr^);

if isvesa<>0 then writeln ('No VESA card found')
   else begin
        writeln('VESA card found');
        writeln('Version: ',mem[infoseg:5],'.',mem[infoseg:4]);
        d:=memw[infoseg:6];
        s:=memw[infoseg:8];
        i:=0;

        repeat
              i:=i+1;
              fabric[i]:=chr(mem[s:d+i-1]); {The manufacturer's string is in}
        until (mem[s:d+i-1]=0);             {ASCIIZ so this ends when 0 found}

   fabric[0]:=chr(i);
   writeln('Manufacturer: ',fabric);
   end;

   freemem(infoptr,257); {Free the info area}

end;

function cdrom:boolean;{Tells if MSCDEX is loaded (and consequently if there is
                          a CD-ROM drive. Returns TRUE if found}

          function check:byte;assembler;asm
                   mov ax,1100h
                   int 2fh
          end;

begin

     if check=255 then cdrom:=true
     else cdrom:=false;

end;

procedure _4dos; {Tells us if 4DOS.COM is loaded and its version}

         function _4check:word;assembler;asm {This checks that is loaded}
                  mov ax,0d44dh
                  xor bh,bh
                  int 2fh
         end;

         function major:byte;assembler;asm
                  mov ax,0d44dh
                  xor bh,bh
                  int 2fh
                  mov al,bl
         end;

         function minor:byte;assembler;asm
                  mov ax,0d44dh
                  xor bh,bh
                  int 2fh
                  mov al,bh
         end;

begin

     if _4check=$44dd then
        writeln('4DOS detected. Version: ',major,'.',minor)
     else
        writeln('4DOS not present');

end;

{Sample program using all functions and procedures}

begin
     clrscr; {No comments ;-) }

     biosdate; {Bios date}

     if pci then writeln ('PCI board found')  {PCI Board}
     else writeln ('No PCI board found');

     if detectfpu then writeln ('Coprocessor found') {Coprocessor}
     else writeln ('No coprocessor found');

     if detectgame then writeln ('Joystick port found')  {Joystick}
     else writeln ('No joystick port found');

     if xms then writeln ('Extended memory manager found') {XMM}
     else writeln ('No extended memory manager found');

     if emm then writeln ('Expanded memory manager found') {EMM}
     else writeln ('No expanded memory manager found');

     svga; {VESA card}

     if cdrom then writeln ('MSCDEX loaded, CD-ROM drive found') {CD-ROM}
     else writeln ('MSCDEX not loaded or there is no CD-ROM');

     _4dos; {4DOS.COM}

end.

{

        Well, that's all for today ;-). I have some other routines but I
didn't include them because they were so messy. I am also interested on
seing your routines :). A lot of this things can be easily taken out from
the famous Ralph Brown Interrupt List.

        Feel free to contact me for commentaries, questions, enhancements
or whatever.

        Pedro Eisman, Cramp / Dark Ritual Demo Group

        Fidonet: 2:341/70.108
        Internet: peisman@emporium.subred.org
        WWW: http://www.geocities.com/SiliconValley/Park/1216

}
