kolibrios/programs/system/pcidev/trunk/pcidev.asm

1042 lines
22 KiB
NASM
Raw Normal View History

;***************************************************************
; project name: PCI Device Enumeration
; target platform: MenuetOS, x86 (IA-32), x86-64 achitectures
; compiler: flat assmebler 1.60
; version: 1.25
; last update: 2th October 2005
; maintained by: Sergey Kuzmin aka Wildwest
; e-mail: kuzmin_serg@list.ru
; project site: http://coolthemes.narod.ru/pcidev.html
;***************************************************************
;Summary: This program will attempt to scan the PCI Bus
; and display basic information about each device
; connected to the PCI Bus.
;***************************************************************
;HISTORY:
;keep dates in european format (dd/mm/yyyy), please
; '!' means big changes
; to-do:
;PCI version should be normalized (0210->02.10)
;----------------------------------------------------------------
;1.25: PCIDEV 02/10/2005
;Author: Sergey Kuzmin aka Wildwest <kuzmin_serg@list.ru>
;Features: !Description is based on Class and SubClass now (PCI 3.0)
; deleted label Descriptions (names of Classes)
; names of Classes and SubClasses are in the end of Vendors.inc
;----------------------------------------------------------------
;1.20: PCIDEV 16/08/2005
;Author: Victor Alberto Gil Hanla a.k.a. vhanla <vhanla@gmail.com>
;Features: !added many vendor lists (865)
; previous version's list deleted
; previous Company Name searching and printing changed
;NOTE:
; It was only tested in my old PII Computer,
; there might be some bugs... PLZ test it and send comments
;----------------------------------------------------------------
;1.15: PCIDEV 03/06/2005
;Author: Sergey Kuzmin aka Wildwest <kuzmin_serg@list.ru>
;Features: added quantity of devices,
; ! detection of Company Name based on Vendor ID,
; database of VenID (35 ID's),
; macros.inc for smaller size,
; interface+(skinned window),
; VenID before DevID in 'table'(was DevID before VenID)
;----------------------------------------------------------------
;1.0: PCIDEV 30/01/2005
;Author: Jason Delozier
;Features: able to detect PCI version, quantity of PCI buses,
; Vendor&Device ID for appropriate Device on Bus;
; detect Revision, Class and Subclass of Device,
; and make Description based on Class
;-------------------------------------------------------------
use32
org 0x0
db 'MENUET01'; 8 byte id
dd 0x01 ; header version
dd START ; start of code
dd I_END ; size of image
dd 0xE000 ; memory for app E000
dd 0xE000 ; esp E000
dd 0x0 , 0x0 ; I_Param , I_Icon
include 'macros.inc'
include 'VENDORS.INC'
START: ; start of execution
call draw_window
still:
mov eax,10 ; wait here for event
int 0x40
cmp eax,1 ; redraw request ?
je red
cmp eax,2 ; key in buffer ?
je key
cmp eax,3 ; button in buffer ?
je button
jmp still
red: ; redraw
call draw_window
jmp still
key: ; key
mov eax,2 ; just read it and ignore
int 0x40
jmp still
button: ; button
mov eax,17 ; get id
int 0x40
cmp ah,1 ; button id=1 ?
jne noclose
mov eax,-1 ; close this program
int 0x40
noclose:
jmp still
; *********************************************
; ******* WINDOW DEFINITIONS AND DRAW ********
; *********************************************
draw_window:
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,1 ; 1, start of draw
int 0x40
; DRAW WINDOW
mov eax,0 ; function 0 : define and draw window
mov ebx,20*65536+750 ; [x start] *65536 + [x size]
mov ecx,20*65536+550 ; [y start] *65536 + [y size]
mov edx,0x03ffffff ; color of work area RRGGBB,8->color gl
mov esi,0x805080d0 ; color of grab bar RRGGBB,8->color gl
mov edi,0x005080d0 ; color of frames RRGGBB
int 0x40
; WINDOW LABEL
mov eax,4 ; function 4 : write text to window
mov ebx,8*65536+8 ; [x start] *65536 + [y start]
mov ecx,0x10ddeeff ; font 1 & color ( 0xF0RRGGBB )
mov edx,labelt ; pointer to text beginning
mov esi,labellen-labelt ; text length
int 0x40
mov [total],0
mov ebx, 20*65536+25 ;Draw work format
mov ecx, 0x224466
mov edx, PCIWin
mov esi, 106 ; lenght of line
newline:
mov eax, 4
int 0x40
add ebx, 10
add edx, 106 ; lenght of line
cmp [edx], byte 'x'
jne newline
call Get_PCI_Info
mov cx, [PCI_Version]
mov eax, 47
mov ebx, 0x00040100
mov esi, 0x00000000
mov edx, 110*65536+45
int 0x40
mov cl, [PCI_LastBus]
mov eax, 47
mov ebx, 0x00020100
mov esi, 0x00000000
mov edx, 110*65536+55
int 0x40
call scan_Pci
xor ecx, ecx
mov cl, [total]
mov eax, 47
mov ebx, 0x00020000
mov esi, 0x00000000
mov edx, 150*65536+65
int 0x40
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,2 ; 2, end of draw
int 0x40
ret
; ***********************************************
; ******* END WINDOW DEFINITIONS & DRAW *******
; ***********************************************
Get_PCI_Info:
mov eax, 62
mov ebx, 0
int 0x40
mov [PCI_Version], ax
;mov [PCI_Version_h], ah
;mov [PCI_Version_l], al
mov eax, 62
mov ebx, 1
int 0x40
mov [PCI_LastBus], al
ret
scan_Pci:
cmp [PCI_LastBus],0xff
jne Pci_Exists
ret
Pci_Exists:
mov [V_Bus], 0 ;reset varibles
mov [V_Dev], 0 ;
mov edx, 20*65536+110 ;start write position
Start_Enum:
mov bl, 6 ;get Device ID / Vendor ID
mov bh, [V_Bus]
mov ch, [V_Dev]
mov cl, 0
mov eax, 62
int 0x40
cmp ax, 0 ;check next slot if nothing exists
je nextDev
cmp ax, 0xffff
je nextDev
mov [PCI_Vendor], ax
shr eax, 16
mov [PCI_Device], ax
mov eax, 62 ;PCI Sys Function
mov bl, 4 ;Read config byte
mov bh, [V_Bus] ;Bus #
mov ch, [V_Dev] ;Device # on bus
mov cl, 0x08 ;Register to read (Get Revision)
int 0x40 ;Read it
mov [PCI_Rev], al ;Save it
mov eax, 62 ;PCI Sys Function
mov cl, 0x0b ;Register to read (Get class)
int 0x40 ;Read it
mov [PCI_Class], al ;Save it
mov eax, 62 ;PCI Sys Function
mov cl, 0x0a ;Register to read (Get Subclass)
int 0x40 ;Read it
mov [PCI_SubClass], al ;Save it
call Print_New_Device
nextDev:
inc [V_Dev]
jno Start_Enum ;jump if no overflow (<256)
mov [V_Dev], 0
inc [V_Bus]
mov al, [PCI_LastBus]
cmp byte [V_Bus], al
jbe Start_Enum
ret
Print_New_Device:
inc [total]
mov eax, 47 ;Write number to screen
mov ebx,0x00040100 ;4 byte number, print in hexidecimal
mov esi, 0x00000000 ;Color of text
xor ecx,ecx
mov cx,[PCI_Vendor] ;Pointer to number to be written
int 0x40 ;Write it
push dx ;Calculate position
mov dx, 62 ;
shl edx, 16 ;
pop dx ;
mov cx, [PCI_Device] ;Write Vendor ID
int 0x40 ;
mov ebx, 0x00020100 ;2 byte number, in hexidecimal format
push dx ;move write cursor
mov dx, 110 ;
shl edx, 16 ;
pop dx ;
mov cl, [V_Bus] ;write bus number
int 0x40 ;
push dx ;move write cursor
mov dx, 146 ;
shl edx, 16 ;
pop dx ;
mov cl, [V_Dev] ;Write device number
int 0x40 ;
push dx ;move write cursor
mov dx, 179 ;
shl edx, 16 ;
pop dx ;
mov cl, [PCI_Rev] ;Draw Revision to screen
int 0x40 ;
push dx ;move write cursor
mov dx, 215 ;
shl edx, 16 ;
pop dx ;
mov cl, [PCI_Class] ;Draw Class to screen
int 0x40 ;
push dx ;move write curson
mov dx, 266 ;
shl edx, 16 ;
pop dx ;
mov cl, [PCI_SubClass] ;Draw Sub Class to screen
int 0x40 ;
;Write Names
push dx ;remember our current write line
mov esi, 17 ;length of text
mov bx, 310 ;X-position of text on screen
shl ebx, 16 ;
mov bx, dx ;Current Y position
mov ecx, 0 ;color of text
mov [cur], dx
mov [r],0
;**********************************************************
; modified part by vhanla (I know it is not a fastest way to search)
; it needs optimization... HELP this project!
;-------------------------------------------------------------------------------
cmp [PCI_Vendor],4807 ; Check if Vendor's value is less than this number
jae next1 ; if it is less, let's continue, or jump to next1
mov [listcount],255 ; number of available lists into this range
mov [r],1 ; counter
mov [valor],50 ; List's number of characters = 50
rep1:
push ebx
xor ebx,ebx
mov bx,[valor]
mov ax,word[_FIRSTPART+bx]
mov [address],_FIRSTPART
add [address],ebx
sub [address],50
pop ebx
cmp [PCI_Vendor],ax
jz ex
add [valor],52 ; Number of characters plus value (WORD) 50+2 bytes
push eax
mov ah,[r]
cmp [listcount],ah
pop eax
jz next1
inc [r]
jmp rep1
;-------------------------------------------------------------------------------
next1:
cmp [PCI_Vendor],5320
jae next2
mov [listcount],255 ; number of available lists into this range
mov [r],1
mov [valor],50
rep2:
push ebx
xor ebx,ebx
mov bx,[valor]
mov ax,word[_SECONDPART+bx]
mov [address],_SECONDPART
add [address],ebx
sub [address],50
pop ebx
cmp [PCI_Vendor],ax
jz ex
add [valor],52
push eax
mov ah,[r]
cmp [listcount],ah
pop eax
jz next2
inc [r]
jmp rep2
;-------------------------------------------------------------------------------
next2:
cmp [PCI_Vendor],5580
jae next3
mov [listcount],255 ; number of available lists into this range
mov [r],1
mov [valor],50
rep3:
push ebx
xor ebx,ebx
mov bx,[valor]
mov ax,word[_THIRDPART+bx]
mov [address],_THIRDPART
add [address],ebx
sub [address],50
pop ebx
cmp [PCI_Vendor],ax
jz ex
add [valor],52
push eax
mov ah,[r]
cmp [listcount],ah
pop eax
jz next3
inc [r]
jmp rep3
;-------------------------------------------------------------------------------
next3:
cmp [PCI_Vendor],65535 ;the last in a WORD
jae next4
mov [listcount],100 ; number of available lists into this range
mov [r],1
mov [valor],50
rep4:
push ebx
xor ebx,ebx
mov bx,[valor]
mov ax,word[_FOURTHPART+bx]
mov [address],_FOURTHPART
add [address],ebx
sub [address],50
pop ebx
cmp [PCI_Vendor],ax
jz ex
add [valor],52
push eax
mov ah,[r]
cmp [listcount],ah
pop eax
jz next4
inc [r]
jmp rep4
;-------------------------------------------------------------------------------
next4:
;-------------------------------------------------------------------------------
; tHIS PART FOR OTHER ... LISTS
mov [listcount],7 ; number of available lists into this range
mov [r],1
mov [valor],50
repO:
push ebx
xor ebx,ebx
mov bx,[valor]
mov ax,word[PREVIOUSVERSIONLIST+bx]
mov [address],PREVIOUSVERSIONLIST
add [address],ebx
sub [address],50
pop ebx
cmp [PCI_Vendor],ax
jz ex
add [valor],52
push eax
mov ah,[r]
cmp [listcount],ah
pop eax
jz next5
inc [r]
jmp repO
;-------------------------------------------------------------------------------
next5:
mov [address],_UNKNOWN
;-------------------------------------------------------------------------------
ex:
; lets print the vendor Name
mov eax,4
mov edx,[address]
mov esi,50
int 0x40
;-------------------------------------------------------------------------------
; END OF SEARCHING AND PRINTING
;------------------------------------------------------------------
; mov esi, 26 ;length of text
; mov bx, 560 ;X-position of text on screen
; shl ebx, 16 ;
; mov bx, [cur] ;Current Y position
; mov ecx, 0 ;color of text
; xor eax, eax ;calculate pointer to string
; mov al, [PCI_Class] ;Determine Description based on class
; mov dl, 26 ;Each description is 26 characters long
; mul dl ;get offset to correct description
; mov edx, Descriptions ;starting point of description text
; add edx, eax ;calculated corresponding description
; mov eax, 4 ;draw text sys function
; int 0x40
cmp [PCI_Class], 00h
je sub0
cmp [PCI_Class], 01h
je sub1
cmp [PCI_Class], 02h
je sub2
cmp [PCI_Class], 03h
je sub3
cmp [PCI_Class], 04h
je sub4
cmp [PCI_Class], 05h
je sub5
cmp [PCI_Class], 06h
je sub6
cmp [PCI_Class], 07h
je sub7
cmp [PCI_Class], 08h
je sub8
cmp [PCI_Class], 09h
je sub9
cmp [PCI_Class], 0Ah
je sub10
cmp [PCI_Class], 0Bh
je sub11
cmp [PCI_Class], 0Ch
je sub12
cmp [PCI_Class], 0Dh
je sub13
cmp [PCI_Class], 0Eh
je sub14
cmp [PCI_Class], 0Fh
je sub15
cmp [PCI_Class], 10h
je sub16
cmp [PCI_Class], 11h
je sub17
jmp endd
sub0:
mov [listcount],2 ; number of available lists into this range
mov [r],1
mov [valor],32
repu0:
push ebx
xor ebx,ebx
mov bx,[valor]
mov ax,word[Class0+bx]
mov [address],Class0
add [address],ebx
sub [address],32
pop ebx
cmp word [PCI_SubClass],ax
jz endd
add [valor],34
push eax
mov ah,[r]
cmp [listcount],ah
pop eax
jz next50
inc [r]
jmp repu0
jmp endd
sub1:
mov [listcount],8 ; number of available lists into this range
mov [r],1
mov [valor],32
repu1:
push ebx
xor ebx,ebx
mov bx,[valor]
mov ax,word[Class1+bx]
mov [address],Class1
add [address],ebx
sub [address],32
pop ebx
cmp word [PCI_SubClass],ax
jz endd
add [valor],34
push eax
mov ah,[r]
cmp [listcount],ah
pop eax
jz next50
inc [r]
jmp repu1
jmp endd
sub2:
mov [listcount],8 ; number of available lists into this range
mov [r],1
mov [valor],32
repu2:
push ebx
xor ebx,ebx
mov bx,[valor]
mov ax,word[Class2+bx]
mov [address],Class2
add [address],ebx
sub [address],32
pop ebx
cmp word [PCI_SubClass],ax
jz endd
add [valor],34
push eax
mov ah,[r]
cmp [listcount],ah
pop eax
jz next50
inc [r]
jmp repu2
jmp endd
sub3:
mov [listcount],4 ; number of available lists into this range
mov [r],1
mov [valor],32
repu3:
push ebx
xor ebx,ebx
mov bx,[valor]
mov ax,word[Class3+bx]
mov [address],Class3
add [address],ebx
sub [address],32
pop ebx
cmp word [PCI_SubClass],ax
jz endd
add [valor],34
push eax
mov ah,[r]
cmp [listcount],ah
pop eax
jz next50
inc [r]
jmp repu3
jmp endd
sub4:
mov [listcount],4 ; number of available lists into this range
mov [r],1
mov [valor],32
repu4:
push ebx
xor ebx,ebx
mov bx,[valor]
mov ax,word[Class4+bx]
mov [address],Class4
add [address],ebx
sub [address],32
pop ebx
cmp word [PCI_SubClass],ax
jz endd
add [valor],34
push eax
mov ah,[r]
cmp [listcount],ah
pop eax
jz next50
inc [r]
jmp repu4
jmp endd
sub5:
mov [listcount],3 ; number of available lists into this range
mov [r],1
mov [valor],32
repu5:
push ebx
xor ebx,ebx
mov bx,[valor]
mov ax,word[Class5+bx]
mov [address],Class5
add [address],ebx
sub [address],32
pop ebx
cmp word [PCI_SubClass],ax
jz endd
add [valor],34
push eax
mov ah,[r]
cmp [listcount],ah
pop eax
jz next50
inc [r]
jmp repu5
jmp endd
sub6:
mov [listcount],12 ; number of available lists into this range
mov [r],1
mov [valor],32
repu6:
push ebx
xor ebx,ebx
mov bx,[valor]
mov ax,word[Class6+bx]
mov [address],Class6
add [address],ebx
sub [address],32
pop ebx
cmp word [PCI_SubClass],ax
jz endd
add [valor],34
push eax
mov ah,[r]
cmp [listcount],ah
pop eax
jz next50
inc [r]
jmp repu6
jmp endd
sub7:
mov [listcount],7 ; number of available lists into this range
mov [r],1
mov [valor],32
repu7:
push ebx
xor ebx,ebx
mov bx,[valor]
mov ax,word[Class7+bx]
mov [address],Class7
add [address],ebx
sub [address],32
pop ebx
cmp word [PCI_SubClass],ax
jz endd
add [valor],34
push eax
mov ah,[r]
cmp [listcount],ah
pop eax
jz next50
inc [r]
jmp repu7
jmp endd
sub8:
mov [listcount],8 ; number of available lists into this range
mov [r],1
mov [valor],32
repu8:
push ebx
xor ebx,ebx
mov bx,[valor]
mov ax,word[Class8+bx]
mov [address],Class8
add [address],ebx
sub [address],32
pop ebx
cmp word [PCI_SubClass],ax
jz endd
add [valor],34
push eax
mov ah,[r]
cmp [listcount],ah
pop eax
jz next50
inc [r]
jmp repu8
jmp endd
sub9:
mov [listcount],6 ; number of available lists into this range
mov [r],1
mov [valor],32
repu9:
push ebx
xor ebx,ebx
mov bx,[valor]
mov ax,word[Class9+bx]
mov [address],Class9
add [address],ebx
sub [address],32
pop ebx
cmp word [PCI_SubClass],ax
jz endd
add [valor],34
push eax
mov ah,[r]
cmp [listcount],ah
pop eax
jz next50
inc [r]
jmp repu9
jmp endd
sub10:
mov [listcount],2 ; number of available lists into this range
mov [r],1
mov [valor],32
repu10:
push ebx
xor ebx,ebx
mov bx,[valor]
mov ax,word[ClassA+bx]
mov [address],ClassA
add [address],ebx
sub [address],32
pop ebx
cmp word [PCI_SubClass],ax
jz endd
add [valor],34
push eax
mov ah,[r]
cmp [listcount],ah
pop eax
jz next50
inc [r]
jmp repu10
jmp endd
sub11:
mov [listcount],7 ; number of available lists into this range
mov [r],1
mov [valor],32
repu11:
push ebx
xor ebx,ebx
mov bx,[valor]
mov ax,word[ClassB+bx]
mov [address],ClassB
add [address],ebx
sub [address],32
pop ebx
cmp word [PCI_SubClass],ax
jz endd
add [valor],34
push eax
mov ah,[r]
cmp [listcount],ah
pop eax
jz next50
inc [r]
jmp repu11
jmp endd
sub12:
mov [listcount],10 ; number of available lists into this range
mov [r],1
mov [valor],32
repu12:
push ebx
xor ebx,ebx
mov bx,[valor]
mov ax,word[ClassC+bx]
mov [address],ClassC
add [address],ebx
sub [address],32
pop ebx
cmp word [PCI_SubClass],ax
jz endd
add [valor],34
push eax
mov ah,[r]
cmp [listcount],ah
pop eax
jz next50
inc [r]
jmp repu12
jmp endd
sub13:
mov [listcount],8 ; number of available lists into this range
mov [r],1
mov [valor],32
repu13:
push ebx
xor ebx,ebx
mov bx,[valor]
mov ax,word[ClassD+bx]
mov [address],ClassD
add [address],ebx
sub [address],32
pop ebx
cmp word [PCI_SubClass],ax
jz endd
add [valor],34
push eax
mov ah,[r]
cmp [listcount],ah
pop eax
jz next50
inc [r]
jmp repu13
jmp endd
sub14:
mov [listcount],1 ; number of available lists into this range
mov [r],1
mov [valor],32
repu14:
push ebx
xor ebx,ebx
mov bx,[valor]
mov ax,word[ClassE+bx]
mov [address],ClassE
add [address],ebx
sub [address],32
pop ebx
cmp word [PCI_SubClass],ax
jz endd
add [valor],34
push eax
mov ah,[r]
cmp [listcount],ah
pop eax
jz next50
inc [r]
jmp repu14
jmp endd
sub15:
mov [listcount],4 ; number of available lists into this range
mov [r],1
mov [valor],32
repu15:
push ebx
xor ebx,ebx
mov bx,[valor]
mov ax,word[ClassF+bx]
mov [address],ClassF
add [address],ebx
sub [address],32
pop ebx
cmp word [PCI_SubClass],ax
jz endd
add [valor],34
push eax
mov ah,[r]
cmp [listcount],ah
pop eax
jz next50
inc [r]
jmp repu15
jmp endd
sub16:
mov [listcount],3 ; number of available lists into this range
mov [r],1
mov [valor],32
repu16:
push ebx
xor ebx,ebx
mov bx,[valor]
mov ax,word[Class10+bx]
mov [address],Class10
add [address],ebx
sub [address],32
pop ebx
cmp word [PCI_SubClass],ax
jz endd
add [valor],34
push eax
mov ah,[r]
cmp [listcount],ah
pop eax
jz next50
inc [r]
jmp repu16
jmp endd
sub17:
mov [listcount],5 ; number of available lists into this range
mov [r],1
mov [valor],32
repu17:
push ebx
xor ebx,ebx
mov bx,[valor]
mov ax,word[Class11+bx]
mov [address],Class11
add [address],ebx
sub [address],32
pop ebx
cmp word [PCI_SubClass],ax
jz endd
add [valor],34
push eax
mov ah,[r]
cmp [listcount],ah
pop eax
jz next50
inc [r]
jmp repu17
jmp endd
next50:
mov [address],_UNKNOWND
endd:
xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx
mov bx, 560 ;X-position of text on screen
shl ebx, 16 ;
mov bx, [cur] ;Current Y position
mov ecx, 0 ;color of text
mov eax,4
mov edx,[address]
mov esi,32
int 0x40
mov dx, 20 ;Starting Y coordinate
shl edx, 16 ;
pop dx ;
add edx, 10 ;Next line down
ret
; DATA AREA
labelt:
db 'PCI Device Enumeration v 1.25 by J. Delozier, S. Kuzmin and V. Hanla'
labellen:
PCIWin:
db 'Please remember to enable PCI Access to Applications in Setup Menu. '
db ' '
db 'PCI Version = '
db 'Last PCI Bus = '
db 'Quantity of devices = '
db ' '
db 'VenID DevID Bus# Dev# Rev Class Subclass Company Description '
db '----- ----- ---- ---- --- ----- -------- ------------------------------------------ ----------------'
db 'x'
valor dw ?
r db ?
cur dw ?
total db ?
address dd ?
listcount db ?
V_Bus db 0
V_Dev db 0
PCI_Version dw 0
PCI_LastBus db 0
PCI_Device dw 0
PCI_Vendor dw 0
PCI_Bus db 0
PCI_Dev db 0
PCI_Rev db 0
PCI_Class db 0
PCI_SubClass db 0
I_END: