[Back to HARDWARE SWAG index] [Back to Main SWAG index] [Original]
{
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
}
[Back to HARDWARE SWAG index] [Back to Main SWAG index] [Original]