.model tiny .486 smart .code org 0h include ..\include\pci.h start: call getpciinfos mov pciversion,bx mov nbbus,cl mov pcitype,al mov si,offset msg mov ah,13 int 47h mov ah,6 int 47h mov si,offset pcivers mov ah,13 int 47h xor edx,edx mov dx,bx xchg dl,dh mov cx,8 mov ah,0Ah int 47h mov si,offset poin mov ah,13 int 47h shr dx,8 mov ah,0Ah int 47h mov si,offset pcivers2 mov ah,13 int 47h mov ah,6 int 47h mov si,offset nbbuses mov ah,13 int 47h xor edx,edx mov dl,nbbus inc dl mov ah,08 int 47h mov ah,06 int 47h mov si,offset typesof mov ah,13 int 47h mov di,offset types mov bx,7 mov al,pcitype vote: bt ax,bx jnc nowas shl bx,1 mov si,[di+bx] mov ah,13 int 47h mov si,offset spac mov ah,13 int 47h shr bx,1 nowas: dec bx jns vote mov ah,6 int 47h xor ax,ax xor cx,cx mov di,offset infos search: call Getallfunctionsinfos jc stopthis mov bp,cx push cx di mov si,offset msg1 mov ah,13 int 47h mov cx,16 xor edx,edx mov dx,[di+pci.device] mov ah,0Ah int 47h mov si,offset msg2 mov ah,13 int 47h mov dx,[di+pci.vendor] mov ah,0Ah int 47h mov si,offset msg4 mov ah,13 int 47h xor dx,dx mov dl,al mov cx,8 mov ah,0Ah int 47h mov ah,07 mov dl,'.' int 47h mov dx,bp xor dh,dh mov cx,8 mov ah,0Ah int 47h mov ah,07 mov dl,'.' int 47h mov dx,bp shr dx,8 mov cx,8 mov ah,0Ah int 47h mov ah,05h int 47h mov si,offset msg3 mov ah,13 int 47h mov cl,[di+pci.class] mov ch,[di+pci.subclass] mov di,offset temp call getpciclass mov si,di mov ah,13 int 47h mov si,offset poin mov ah,13 int 47h mov di,offset temp call getpcisubclass mov si,di mov ah,13 int 47h mov ah,06 int 47h pop di cx inc ch cmp ch,7 jbe search stopthis: xor ch,ch inc cl cmp cl,31 jbe search xor cl,cl inc al cmp al,16 jbe search db 0CBh msg3 db ' Classe :',0 msg1 db 'Peripherique :',0 msg2 db ' Constructeur :',0 msg4 db ' iD :',0 msg db 'COS2000 hardware detecteur V1.6',0 pcivers db 'BIOS PCI version ',0 pcivers2 db ' a ete detecte !',0 nbbuses db 'Nombre de bus : ',0 typesof db 'Caracterisques PCI: ',0 poin db '.',0 virg db ', ',0 spac db ' ',0 temp db 128 dup (0) types dw config1 dw config2 dw poin dw poin dw config3 dw config4 dw poin dw poin config1 db 'Config Mechanism 1',0 config2 db 'Config Mechanism 2',0 config3 db 'Special Cycle Mechanism 1',0 config4 db 'Special Cycle Mechanism 2',0 PciVersion dw 0 Nbbus db 0 PciType db 0 infos db 256 dup (0) ;fonction 0-7 bus 0-255 device 0-31 ;renvoie en es:di de classe cl getpciclass: push ax cx si di ds es push es push di mov di,cx and di,0FFh shl di,1 mov di,[offset classes+di] mov cx,0FFh mov al,0 push cs pop es repne scasb sub cx,0FFh neg cx sub di,cx mov si,di push cs pop ds pop di pop es rep movsb pop es ds di si cx ax ret ;renvoie en es:di la sous-classe de ch et de classe cl getpcisubclass: push ax cx si di ds es push es push di mov di,cx and di,0FFh shl di,1 mov di,[offset classesd+di] xchg ch,cl xor ch,ch cmp cx,80h jne suiteac mov di,offset divers jmp found suiteac: shl cx,1 add di,cx mov di,[di] found: mov cx,0FFh mov al,0 push cs pop es repne scasb sub cx,0FFh neg cx sub di,cx mov si,di push cs pop ds pop di pop es rep movsb pop es ds di si cx ax ret divers db 'divers',0 classes: dw offset class0 dw offset class1 dw offset class2 dw offset class3 dw offset class4 dw offset class5 dw offset class6 dw offset class7 dw offset class8 dw offset class9 dw offset class10 dw offset class11 dw offset class12 class0 db 'Ancien',0 class1 db 'Stockage',0 class2 db 'Reseau',0 class3 db 'Affichage',0 class4 db 'Multimedia',0 class5 db 'Memoire',0 class6 db 'Pont',0 class7 db 'Communication',0 class8 db 'Systeme',0 class9 db 'Acquisition',0 class10 db 'Dock',0 class11 db 'Processeur',0 class12 db 'Bus serie',0 ;Classes et sous classes classesd: dw offset class0d dw offset class1d dw offset class2d dw offset class3d dw offset class4d dw offset class5d dw offset class6d dw offset class7d dw offset class8d dw offset class9d dw offset class10d dw offset class11d dw offset class12d class0d: dw offset subclass00 dw offset subclass01 subclass00 db 'divers',0 subclass01 db 'vga',0 class1d: dw offset subclass10 dw offset subclass11 dw offset subclass12 dw offset subclass13 subclass10 db 'scsi',0 subclass11 db 'ide',0 subclass12 db 'disquette',0 subclass13 db 'ipi',0 class2d: dw offset subclass20 dw offset subclass21 dw offset subclass22 subclass20 db 'ethernet',0 subclass21 db 'token ring',0 subclass22 db 'fddi',0 class3d: dw offset subclass30 dw offset subclass31 subclass30 db 'vga',0 subclass31 db 'xga',0 class4d: dw offset subclass40 dw offset subclass41 subclass40 db 'video',0 subclass41 db 'audio',0 class5d: dw offset subclass50 dw offset subclass51 subclass50 db 'ram',0 subclass51 db 'flash',0 class6d: dw offset subclass60 dw offset subclass61 dw offset subclass62 dw offset subclass63 dw offset subclass64 dw offset subclass65 dw offset subclass66 dw offset subclass67 subclass60 db 'hote',0 subclass61 db 'isa',0 subclass62 db 'eisa',0 subclass63 db 'mca',0 subclass64 db 'pci',0 subclass65 db 'pcmcia',0 subclass66 db 'nubus',0 subclass67 db 'cardbus',0 class7d: dw offset subclass70 dw offset subclass71 subclass70 db 'serie',0 subclass71 db 'parallele',0 class8d: dw offset subclass80 dw offset subclass81 dw offset subclass82 subclass80 db 'pic',0 subclass81 db 'dma',0 subclass82 db 'timer',0 class9d: dw offset subclass90 dw offset subclass91 dw offset subclass92 subclass90 db 'clavier',0 subclass91 db 'stylo',0 subclass92 db 'souris',0 class10d: dw offset subclass100 subclass100 db 'station',0 class11d: dw offset subclass110 dw offset subclass111 dw offset subclass112 dw offset subclass113 dw offset subclass114 subclass110 db '386',0 subclass111 db '486',0 subclass112 db 'pentium',0 subclass113 db 'alpha',0 subclass114 db 'coprocesseur',0 class12d: dw offset subclass120 dw offset subclass121 dw offset subclass122 dw offset subclass123 dw offset subclass124 subclass120 db 'firewire',0 subclass121 db 'access',0 subclass122 db 'ssa',0 subclass123 db 'usb',0 subclass124 db 'smbus',0 ;bx pci version, cl nbbus, al pci type getPciInfos: push dx mov ax,0B101h xor edi,edi mov edx," PCI" int 1Ah jc ErrorPci cmp dx,04350h jne ErrorPci clc pop dx ret errorpci: stc pop dx ret ;al=bus cl=deviceid ch=func es:di Getallfunctionsinfos: push ax bx dx di cmp ch,0 je amultiorfirst mov bl,0Eh push cx xor ch,ch call getfunctioninfo pop cx and dl,80h cmp dl,0 jne amultiorfirst mov word ptr [di],0000h jmp notexist amultiorfirst: xor bl,bl goinfos: call getfunctioninfo inc bl cmp bl,2 ja notzarb cmp dl,0FFh je notexist notzarb: mov es:[di],dl inc di cmp bl,255 jb goinfos pop di push di cmp word ptr [di],0000h je notexist clc pop di dx bx ax ret notexist: stc pop di dx bx ax ret ; PCI TYPE 1 ;******************************************************************* config1_addr equ 0CF8h config1_data equ 0CFCh pci_type1_detect: mov dx, config1_addr+3 mov al, 01h out dx,al mov dx,config1_addr in eax,dx mov ecx,eax mov eax,80000000h out dx,eax in eax,dx cmp eax,80000000h jne endofdetectiontype1 mov eax,ecx out dx,eax endofdetectiontype1: ret ;al=bus bl=index cl=deviceid ch=func->dl getfunctioninfo: push eax bx cx mov ah,80h shl eax,16 mov ah,cl shl ah,3 or ah,ch mov al,bl and al,0fch mov dx,0cf8h out dx,eax mov dx,0CFCh and bl,3 or dl,bl in al,dx mov dl,al pop cx bx eax ret ; PCI TYPE 2 ;******************************************************************* config2_reg0 equ 0CFBh config2_reg1 equ 0CF8h config2_reg2 equ 0CFAh pci_type2_detect: xor ax,ax mov dx,config2_reg0 out dx,ax mov dx,config2_reg1 out dx,ax mov dx,config2_reg2 out dx,ax mov ax,config2_reg1 in al,dx cmp al,0 jne endofdetectiontype2 mov ax,config2_reg0 in al,dx cmp al,0 jne endofdetectiontype2 endofdetectiontype2: ret end start