/*  Die folgende Funktion zeigt eine M”glichkeit auf, wie die
    I/O-Adresse einer KOLTER-Karte ermittelt werden kann.

    Als šbergabewert der Funktion ist die Device ID der
    entsprechenden Karte anzugeben (Beispiel: PCI-16/16 = 0x0010).

    Der Rckgabewert der Funktion beinhaltet die I/O-Adresse
    der Karte oder 0, wenn keine Karte gefunden wurde bzw. keine
    Plug'n Play-Adresse vergeben wurde. 

    Wichtig:
    Bei der Einbindung dieser Funktion in ein Programm
    ist zu beachten, dass fr den Compiler der 386er
    Befehlssatz verwendet wird, da sonst Zugriffe
    auf erweiterten Register (ECX) nicht untersttzt werden.
*/

unsigned long get_io_adr(unsigned int Device)

{

unsigned int slot_no;
unsigned long io_adr;
unsigned long ven_dev;
unsigned long K_ven_dev;

io_adr = 0;

K_ven_dev = Device;                       /* Device und VendorID werden*/
K_ven_dev = K_ven_dev << 16 | 0x1001;     /* verknpft                 */
for (slot_no = 0;(slot_no <= 0x00F8) && (io_adr == 0);slot_no += 8)
	{
	asm mov bx,slot_no
        asm mov di,0x0000                 /* Alle PCI-Einheiten werden */
        asm mov ax,0xb10a                 /* nach der entsprechenden   */
        asm int 0x1a                      /* KOLTER-Karten durchsucht. */
	asm mov ven_dev,ecx
        if (K_ven_dev == ven_dev)         /* Konnte die Karte gefunden */
                {                         /* werden, so wird die ent-  */
                asm mov ax,0xb10a         /* sprechende I/O-Adresse    */
                asm mov bx,slot_no        /* ausgelesen.               */
		asm mov di,0x0010
		asm int 0x1a
		asm mov io_adr,ecx
		}
	}
io_adr &= 0xFFFFFFF0;                     /* I/O-Adresse wird maskiert */
return(io_adr);                           /* Rckgabe der I/O-Adresse  */

}
