program Project2;
{$APPTYPE CONSOLE}

uses sysutils, classes;

// I/O-Abläufe und PCI-Config-Daten über externe DLLs steuern
function pci_getslot(vendor_id:word; device_id:word; karte:word):word;stdcall;export;
external 'PCICONF.DLL';

function pci_getver():word;stdcall;export;
external 'PCICONF.DLL';

function pci_getbus(vendor_id:word; device_id:word):byte;stdcall;export;
external 'PCICONF.DLL';

function pci_getfind(vendor_id:word; device_id:word):byte;stdcall;export;
external 'PCICONF.DLL';

function pci_gethead(vendor_id:word; funcdev:byte; bus:byte; reg_number:word):byte;stdcall;export;
external 'PCICONF.DLL';

function pci_getio(vendor_id:word; device_id:word; index_no:word):longword;stdcall;export;
external 'PCICONF.DLL';

// ------------------------------------------------------------------------
// (main) Hauptprogramm

var   ADR         : longword;
      karte       : word;
      reg_number  : word;
      byte_return : byte;
      bus         : byte;
      funcdev     : byte;
      version     : word;
      slot        : word;
      vendor      : word;
      device      : word;

begin
writeln('PCI - Testprogramm mit Delphi   (c) KOLTER ELECTRONIC ');
writeln('');

// unbedingt vorgeben um auszuwerten !!!
vendor := $1001;         // immer $1001 hex fest (KOLTER)
device := $0017;         // je nach PCI-Karte 10...17

// falls mehrere PCI-Karten mit einer device in einem System
karte  := 0;

writeln('Vendor-ID          ',IntToHex(vendor,4));
writeln('Device-ID          ',IntToHex(device,4));
writeln('Karten-Nummer      ',IntToHex(karte,2));
writeln('');

// zeigt die PCI-Version vom BIOS an
version := pci_getver();
writeln('PCI-Version        ',IntToHex(version,4));

// diese funktion holt die PCI-Bus-Nummer ab
bus := pci_getbus(vendor, device);
writeln('PCI-Bus            ',IntToHex(bus,2));

// diese funktion gibt die Slot-Nummer der Karte zurück
slot := pci_getslot(vendor, device, karte);
writeln('Slot-Nummer        ',slot);

// diese funktion holt die I/O-Adresse ab
// pci_getio(vendor-id 0x1001, device-id 0..255, karten-index 0..31);
ADR := pci_getio(vendor, device, karte);
writeln('I/O-Adresse HEX.   ',IntToHex(ADR,8));

// pci-device finden und funktion zurückgeben
funcdev := pci_getfind(vendor, device);
writeln('Funktion           ',IntToHex(funcdev,2));
writeln('');

// alle Registerinhalte vom PCI-Dekoder zeigen
// pci_gethead(vendor-id 0x1001, funk/dev, bus 0..31, reg_num 0..255);
writeln('Config.-Data PCI-Chip intern:');
for reg_number := 0 to 63 do
begin
byte_return := pci_gethead(vendor, funcdev, bus, reg_number);
write('',IntToHex(byte_return,1));
end;

writeln(''); writeln('');
writeln('Taste fuer beenden ...');
Readln;

end.

