2,26 → 2,61 |
; project name: PCI Device Enumeration |
; target platform: KolibriOS |
; compiler: flat assembler 1.68 |
; version: 2.21 |
; last update: December 2007 |
; version: 2.3 |
; last update: June 2011 |
; maintained by: Jason Delozier (cordata51@hotmail.com) |
; Sergey Kuzmin (kuzmin_serg@list.ru) |
; Mihailov Ilia (ghost.nsk@gmail.com) |
; Marat Zakiyanov <mario79@bk.ru> |
; Artem Jerdev (art_zh@yahoo.com) |
; project site: http://www.coolthemes.narod.ru/pcidev.html |
; Evgeny Grechnikov |
; VeroniƱa (Clever Mouse) |
; Yogev Ezra |
; old project site: http://www.coolthemes.narod.ru/pcidev.html |
; new project site: http://board.kolibrios.org/viewtopic.php?f=42&t=73 |
;*************************************************************** |
;Summary: This program will attempt to scan the PCI Bus |
; and display basic information about each device |
; connected to the PCI Bus. |
;*************************************************************** |
;----------------------------------------------------------------------------- |
include '../../../macros.inc' |
;include 'macros.inc' |
|
MEOS_APP_START |
CODE |
include '../../../develop/libraries/box_lib/load_lib.mac' |
;----------------------------------------------------------------------------- |
use32 |
org 0x0 |
db 'MENUET01' ; 8 byte id |
dd 0x01 ; header version |
dd START ; start of code |
dd IM_END ; size of image |
dd I_END ; memory for app |
dd stacktop ; esp |
dd 0 ; I_Param |
dd path ; APPLICATION PACH |
;----------------------------------------------------------------------------- |
@use_library ; load_lib macro |
;----------------------------------------------------------------------------- |
START: |
mcall 68,11 |
mcall 66,1,1 |
;----------------------------------------------------------------------------- |
load_libraries l_libs_start,end_l_libs |
;----------------------------------------------------------------------------- |
;OpenDialog initialisation |
push dword OpenDialog_data |
call [OpenDialog_Init] |
|
mov edi,filename_area |
mov esi,start_temp_file_name |
call copy_file_name_path |
;----------------------------------------------------------------------------- |
mcall 68,12,4096 |
mov [store_text_area_start],eax |
;----------------------------------------------------------------------------- |
call draw_window |
|
still: mcall 10 ; wait here for event |
still: |
mcall 10 ; wait here for event |
dec eax ; redraw request ? |
jz red |
dec eax ; key in buffer ? |
29,7 → 64,7 |
dec eax ; button in buffer ? |
jz button |
jmp still |
|
;----------------------------------------------------------------------------- |
red: ; redraw |
mcall 9, Proc_Info, -1 ; window redraw requested so get new window coordinates and size |
mov eax, [Proc_Info.box.left]; store the window coordinates into the Form Structure |
42,21 → 77,112 |
mov [Form + 4] ,ax ; window height |
call draw_window ; go redraw window now |
jmp still |
|
;----------------------------------------------------------------------------- |
key: ; key |
mcall 2 ; just read it and ignore |
cmp [extended_key],1 |
je .extended_key |
test al, al |
jnz still |
cmp ah, 0xE0 |
jne @f |
mov [extended_key],1 |
jmp still |
@@: |
cmp ah,129 ; Esc |
je button.exit |
cmp ah,159 |
je call_OpenDialog |
jmp still |
.extended_key: |
mov [extended_key],0 |
cmp ah,129 ; Esc |
je button.exit |
cmp ah,159 |
je call_OpenDialog |
jmp still |
;----------------------------------------------------------------------------- |
button: ; button |
mcall 17 ; get id |
cmp ah,2 |
je call_OpenDialog |
cmp ah, 1 ; button id = 1 ? |
jne still |
.exit: |
mcall -1 ; close this program |
;----------------------------------------------------------------------------- |
call_OpenDialog: |
mov [OpenDialog_data.type],1 ; Save |
|
push dword OpenDialog_data |
call [OpenDialog_Start] |
|
cmp [OpenDialog_data.status],2 ; OpenDialog does not start |
je .save_file_default_path |
|
cmp [OpenDialog_data.status],1 |
jne still |
|
call store_data |
jmp still |
;---------------------------------------- |
.save_file_default_path: |
mov edi,file_name |
mov esi,file_default_path |
call copy_file_name_path |
call store_data |
jmp still |
;---------------------------------------- |
copy_file_name_path: |
xor eax,eax |
cld |
@@: |
lodsb |
stosb |
test eax,eax |
jnz @r |
ret |
;----------------------------------------------------------------------------- |
prepare_text_area: |
mov edi,[store_text_area_start] |
|
push edi |
mov ecx,4096/4 ; I hope this will be enough for store of data |
mov eax,dword ' ' |
cld |
rep stosd |
pop edi |
|
mov esi,PCIWin |
xor ecx,ecx |
@@: |
mov cl,[esi] |
inc esi |
rep movsb |
mov al,0Ah ; CR - carriage return |
stosb |
cmp [esi],byte 0xFF |
jne @r |
|
mov [store_text_area_end],edi |
|
xor edi,edi |
ret |
;----------------------------------------------------------------------------- |
draw_window: |
call prepare_text_area |
|
mov byte [total], 0 |
mcall 12, 1 ; start of draw |
; DRAW WINDOW |
mcall 0, dword [Form], dword [Form + 4], 0x13ffffff, 0x805080d0, title |
mcall 0,dword [Form],dword [Form + 4],0x13ffffff,0x805080d0,title |
mcall 8,<450,100>,<25,25>,2,0xC0C0C0 |
shr ecx,16 |
mov bx,cx |
add ebx,13 shl 16+4 |
mcall 4,,0x80000000,text_save_button |
add bx,11 |
mcall ,,,text_save_button.1 |
; Insert horizontal bars in list area |
mov eax, 13 ; draw bar system function |
mov ebx, 18 ; set Xstart position of bar |
75,6 → 201,7 |
shl ecx, 16 ; set that values as Ystart |
add ecx, 10 ; Bar Height is always 10 pixels |
jmp again ; draw another bar |
;----------------------------------------------------------------------------- |
nomo: ;done drawing bars here |
; start PCI stuff |
call Get_PCI_Info ; get pci version and last bus, scan for and draw each pci device |
96,7 → 223,8 |
mov ebx, 20 * 65536 + 25 ; x start, ystart of text |
mov ecx, 0x224466 ; color of text |
mov eax, 4 |
@@: movzx esi, byte[edx] |
@@: |
movzx esi, byte[edx] |
inc edx |
mcall |
add ebx, 10 |
118,8 → 246,17 |
@@: |
mcall 12, 2 ; end of draw |
ret |
|
;------------------------------------------------------------------ |
;----------------------------------------------------------------------------- |
store_data: |
mov eax,[store_text_area_start] |
mov [fileinfo.return],eax |
mov ebx,[store_text_area_end] |
sub ebx,eax |
inc ebx |
mov [fileinfo.size],ebx |
mcall 70,fileinfo |
ret |
;----------------------------------------------------------------------------- |
;* Gets the PCI Version and Last Bus |
Get_PCI_Info: |
mcall 62, 0 |
131,6 → 268,7 |
cmp al, 0xff ; 0xFF means no pci bus found |
jne Pci_Exists ; |
ret ; if no bus then leave |
;----------------------------------------------------------------------------- |
Pci_Exists: |
mov byte [V_Bus], 0 ; reset varibles |
mov byte [V_Dev], 0 ; |
144,6 → 282,7 |
|
cmp ax, 0 ; Vendor ID should not be 0 or 0xFFFF |
je nextDev ; check next device if nothing exists here |
|
cmp ax, 0xffff ; |
je nextDev ; |
|
155,6 → 294,7 |
mov ch, byte [V_Dev] ; Device # on bus |
mov cl, 0x08 ; Register to read (Get Revision) |
mcall 62 ; Read it |
|
mov byte [PCI_Rev], al ; Save it |
mov cl, 0x0b ; Register to read (Get class) |
mcall 62 ; Read it |
166,15 → 306,19 |
; by Mario79 august 2006 |
mov cl, 0x09 ; Register to read (Get Interface) |
mcall 62 ; Read it |
|
mov [PCI_Interface], al ; Save it |
; |
; by Ghost april 2007 |
mov cl, 0x3c ; Register to read (Get IRQ) |
@@: mcall 62 ; Read it |
@@: |
mcall 62 ; Read it |
|
mov [PCI_IRQ], al ; Save it |
; by CleverMouse juny 2011 |
mov cl, 0x0e |
mcall 62 |
|
push eax |
inc byte [total] ; one more device found |
call Print_New_Device ; print device info to screen |
182,8 → 326,10 |
pop eax |
test al, al |
js nextDev |
|
test byte [V_Dev], 7 |
jnz nextDev |
|
or byte [V_Dev], 7 |
nextDev: |
inc byte [V_Dev] ; next device on this bus |
195,7 → 341,7 |
cmp byte [V_Bus], al ; was it last bus |
jbe Start_Enum ; if not jump to keep searching |
ret |
|
;----------------------------------------------------------------------------- |
no_ummio_allowed: |
xor al,al |
mov [MMIO_allowed],al ; re-enter the subroutine |
210,13 → 356,17 |
mov ch, byte [V_Bus] |
mov cl, byte [V_Dev] |
mcall 62, 11 ; detect uMMIO |
|
and ax,0x7fff |
inc ax ; -1 returned? |
jo no_ummio_allowed |
|
inc ax ; -2 returned? |
jo no_ummio_here |
|
inc ax ; -3 returned? |
jo no_ummio_here |
|
mov esi, 0x990033 ; highlighted text color |
mov bh, byte [V_Bus] |
mov bl, byte [V_Dev] |
237,14 → 387,23 |
no_ummio_here: |
movzx ecx,word [PCI_Vendor] ; Pointer to number to be written |
mcall 47, 0x00040100 ; Write Vendor ID |
|
call store_4_digits |
|
and edx, 0xFFFF ;***************************************** |
or edx, 54 * 65536 ; X start becomes 54 |
movzx ecx, word [PCI_Device] ; get Vendor ID |
mcall ; Draw Vendor ID to Window |
|
call store_4_digits |
|
and edx, 0xFFFF ;***************************************** |
or edx, 98 * 65536 ; X start becomes 98 |
movzx ecx, byte [V_Bus] ; get bus number |
mcall ,0x00020100 ; draw bus number to screen |
|
call store_2_digits |
|
and edx, 0xFFFF ;***************************************** |
or edx, 128 * 65536 ; X start becomes 128 |
movzx ecx, byte [V_Dev] ; get device number |
251,38 → 410,58 |
shr ecx, 3 ; device number is bits 3-7 |
mcall ; Draw device Number To Window |
|
call store_2_digits |
|
and edx, 0xFFFF ;***************************************** |
or edx, 155 * 65536 ; X start becomes 155 |
movzx ecx, byte [V_Dev] ; get Function number |
and ecx, 7 ; function is first 3 bits |
mcall ; Draw Function Number To Window |
|
call store_2_digits |
|
and edx, 0xFFFF ;***************************************** |
or edx, 179 * 65536 ; X start becomes 179 |
movzx ecx, byte [PCI_Rev] ; get revision number |
mcall ; Draw Revision to screen |
|
call store_2_digits |
|
and edx, 0xFFFF ;***************************************** |
or edx, 215*65536 ; X start becomes 215 |
movzx ecx, byte [PCI_Class] ; get PCI_Class |
mcall ; Draw Class to screen |
|
call store_2_digits |
|
and edx, 0xFFFF ;***************************************** |
or edx, 250*65536 ; X start becomes 250 |
movzx ecx, byte [PCI_SubClass]; get sub class |
mcall ; Draw Sub Class to screen |
|
call store_2_digits |
|
; from Mario79 august 2006 |
and edx, 0xFFFF ;***************************************** |
or edx, 280 * 65536 ; X start becomes 280 |
movzx ecx, [PCI_Interface] ; get Interface |
mcall |
|
call store_2_digits |
|
; |
; from Ghost april 2007 ;***************************************** |
movzx ecx, [PCI_IRQ] ; get Interface |
cmp cl, 0x0f ; IRQ between 0..15 |
ja @f |
|
and edx, 0xFFFF |
or edx, 310 * 65536 ; X start becomes 310 |
mcall |
|
call store_2_digits |
|
@@: |
; |
;Write Names |
movzx ebx, dx ; Set y position |
or ebx, 340 * 65536 ; set Xposition to 340 |
295,15 → 474,21 |
mov edx, VendorsTab |
mov cx, word[PCI_Vendor] |
|
.fn: mov ax, [edx] |
.fn: |
mov ax, [edx] |
add edx, 6 |
test ax, ax |
jz .find |
|
cmp ax, cx |
jne .fn |
.find: mov edx, [edx - 4] |
|
.find: |
mov edx, [edx - 4] |
mcall 4,, 0x80000000 ; lets print the vendor Name |
|
|
mov [store_text_size],42 |
call store_text |
;------------------------------------------------------------------ |
; Get description based on Class/Subclass |
; |
313,26 → 498,39 |
and eax, 0xffffff |
xor edx, edx |
xor esi, esi |
.fnc: inc esi |
.fnc: |
inc esi |
mov ecx, [Classes + esi * 8 - 8] |
cmp cx, 0xffff |
je .endfc |
|
cmp cx, ax |
jne .fnc |
|
test ecx, 0xff000000 |
jz @f |
|
mov edx, [Classes + esi * 8 - 4] |
jmp .fnc |
@@: cmp eax, ecx |
@@: |
cmp eax, ecx |
jne .fnc |
|
xor edx, edx |
.endfc: test edx, edx |
.endfc: |
test edx, edx |
jnz @f |
|
mov edx, [Classes + esi * 8 - 4] |
@@: |
and ebx, 0x0000FFFF ; clear X position |
or ebx, 0x24E0000 ; set X position to 590 pixels |
mcall 4,, 0x80000000,, 32 ; draw the text |
|
mov [store_text_size],0 |
call store_text |
call store_CR |
|
movzx edx, bx ; get y coordinate |
add edx, 0x0014000A ; add 10 to y coordinate and set x coordinate to 20 |
mov [gr_pos], edx |
349,15 → 547,18 |
or bx, 12 ; function 12 |
mov ecx, 4096 ; =1 page to map |
mcall 62 |
|
mov [MMIO_Map], eax ; store MMIO lin.addr. |
mov ecx, 0x80990022 ; print color : red |
add bh, '0' |
cmp eax, -3 |
jne @f |
|
mov [bar_um+3], bh |
mov ebx, [gr_pos] |
mov edx, bar_um |
mcall 4 |
|
jmp mmio_next_bar |
@@: |
cmp eax, -4 |
366,6 → 567,7 |
mov ebx, [gr_pos] |
mov edx, bar_io |
mcall 4 |
|
jmp mmio_next_bar |
@@: |
cmp bh, '6' ; expansion ROM ? |
374,7 → 576,9 |
mov ebx, [gr_pos] |
mov edx, bar_ram |
mcall 4 |
|
jmp mmio_dump |
;----------------------------------------------------------------------------- |
@@: |
mov ebx, [gr_pos] |
mov edx, bar_rom |
387,6 → 591,7 |
add ebx, 10 |
mov [gr_pos], ebx |
mcall 4 |
|
mov ecx, [MMIO_Map] ; release the tried page |
mcall 62,13 |
|
395,28 → 600,106 |
inc bh |
cmp bh,7 |
je @f |
|
mov [MMIO_BAR], bh |
add [gr_pos], 10 |
jmp Try_MMIO |
|
;----------------------------------------------------------------------------- |
@@: |
xor bh,bh |
mov [MMIO_BAR], bh |
ret |
;----------------------------------------------------------------------------- |
store_CR: |
pusha |
mov edi,[store_text_area_end] |
mov [edi],word 0A20h ; CR (carriage return) + SPACE |
add dword [store_text_area_end],2 |
popa |
ret |
;----------------------------------------------------------------------------- |
store_text: |
pusha |
inc dword [store_text_area_end] |
mov esi,edx |
mov edi,[store_text_area_end] |
push edi |
xor eax,eax |
cld |
@@: |
lodsb |
test eax,eax |
jz @f |
stosb |
inc dword [store_text_area_end] |
jmp @r |
@@: |
pop esi |
mov eax,[store_text_size] |
test eax,eax |
jz @f |
sub edi,esi |
sub eax,edi |
add [store_text_area_end],eax |
@@: |
popa |
ret |
;----------------------------------------------------------------------------- |
store_4_digits: |
pusha |
mov ebx,ecx |
mov ecx,4 |
mov edi,[store_text_area_end] |
call binary_to_hex_string |
add [store_text_area_end],dword 6 |
popa |
ret |
;----------------------------------------------------------------------------- |
store_2_digits: |
pusha |
inc [store_text_area_end] |
mov ebx,ecx |
mov ecx,2 |
mov edi,[store_text_area_end] |
call binary_to_hex_string |
add [store_text_area_end],dword 4 |
popa |
ret |
;----------------------------------------------------------------------------- |
; ebx - value |
; ecx - digits |
; edi - output string |
binary_to_hex_string: |
add edi,ecx |
dec edi |
std |
.1: |
mov al,bl |
and al,0xf |
shr ebx,4 |
cmp al,9 |
jbe @f |
|
|
add al,0x27 |
@@: |
add al,0x30 |
stosb |
dec ecx |
jnz .1 |
cld |
ret |
;----------------------------------------------------------------------------- |
include 'vendors.inc' |
;------------------------------------------------------------------ |
;----------------------------------------------------------------------------- |
; DATA AREA |
DATA |
|
|
Form: dw 800 ; window width (no more, special for 800x600) |
dw 100 ; window x start |
dw 620 ; window height |
dw 20 ; window y start |
|
title db 'PCI Device Enumerator v 2.21 by J.Delozier, S.Kuzmin, V.Hanla, M.Zakiyanov, A.Jerdev', 0 |
title db 'PCI Device Enumerator v 2.3 by J.Delozier, S.Kuzmin, V.Hanla, M.Zakiyanov, A.Jerdev, E.Grechnikov, V.Clever Mouse, Y.Ezra', 0 |
|
PCIWin mls \ |
' Don`t forget to enable PCI Access to Applications in Setup Menu.',\ |
427,7 → 710,7 |
'',\ |
'VenID DevID Bus# Dev# Fnc Rev Class Subclass/ IRQ Company Description',\ |
' Interface',\ |
'----- ----- ---- ---- --- --- ----- --------- --- ------------------------------------------ ----------------' |
'----- ----- ---- ---- --- --- ----- --------- --- ------------------------------------------ --------------------------------' |
|
bar_ram db 'BARx: MMIO block', 0 |
bar_io db 'BARx: IO ports',0 |
434,10 → 717,90 |
bar_um db 'BARx: unmapped',0 |
bar_rom db 'BAR6: Expansion ROM', 0 |
|
;------------------------------------------------------------------ |
text_save_button: |
db 'Save PCI list',0 |
.1: db '(Press S key)',0 |
;--------------------------------------------------------------------- |
system_dir_ProcLib db '/sys/lib/proc_lib.obj',0 |
|
err_message_found_lib2 db 'proc_lib.obj - Not found!',0 |
|
err_message_import2 db 'proc_lib.obj - Wrong import!',0 |
|
head_f_i: |
head_f_l db 'error',0 |
;--------------------------------------------------------------------- |
l_libs_start: |
|
library02 l_libs system_dir_ProcLib+9, path, library_path, system_dir_ProcLib, \ |
err_message_found_lib2, head_f_l, ProcLib_import, err_message_import2, head_f_i |
|
end_l_libs: |
;--------------------------------------------------------------------- |
align 4 |
ProcLib_import: |
OpenDialog_Init dd aOpenDialog_Init |
OpenDialog_Start dd aOpenDialog_Start |
;OpenDialog__Version dd aOpenDialog_Version |
dd 0 |
dd 0 |
aOpenDialog_Init db 'OpenDialog_init',0 |
aOpenDialog_Start db 'OpenDialog_start',0 |
;aOpenDialog_Version db 'Version_OpenDialog',0 |
;--------------------------------------------------------------------- |
align 4 |
OpenDialog_data: |
.type dd 0 |
.procinfo dd Proc_Info ;+4 |
.com_area_name dd communication_area_name ;+8 |
.com_area dd 0 ;+12 |
.opendir_pach dd temp_dir_pach ;+16 |
.dir_default_pach dd communication_area_default_pach ;+20 |
.start_path dd open_dialog_path ;+24 |
.draw_window dd draw_window ;+28 |
.status dd 0 ;+32 |
.openfile_pach dd file_name ;+36 |
.filename_area dd filename_area ;+40 |
.filter_area dd Filter |
.x: |
.x_size dw 420 ;+48 ; Window X size |
.x_start dw 10 ;+50 ; Window X position |
.y: |
.y_size dw 320 ;+52 ; Window y size |
.y_start dw 10 ;+54 ; Window Y position |
|
communication_area_name: |
db 'FFFFFFFF_open_dialog',0 |
open_dialog_path: |
db '/sys/File Managers/opendial',0 |
communication_area_default_pach: |
db '/sys',0 |
Filter: |
dd Filter.end - Filter.1 |
.1: |
db 'TXT',0 |
db 'LOG',0 |
.end: |
dd 0 |
|
file_default_path: |
db '/sys/' |
start_temp_file_name: |
db 'pcidev.txt',0 |
;--------------------------------------------------------------------- |
align 4 |
fileinfo: |
.subfunction dd 2 |
.Offset dd 0 |
.Offset_1 dd 0 |
.size dd 4096 |
.return dd 0 |
db 0 |
.name: dd file_name |
;----------------------------------------------------------------------------- |
|
; UNINITIALIZED DATA AREA |
UDATA |
|
IM_END: |
total db ? |
V_Bus db ? |
V_Dev db ? |
463,6 → 826,34 |
|
gr_pos dd ? |
|
store_text_area_start dd ? |
store_text_area_end dd ? |
store_text_size dd ? |
|
extended_key rb 1 |
;--------------------------------------------------------------------- |
library_path: |
rb 4096 |
;--------------------------------------------------------------------- |
path: |
rb 4096 |
;--------------------------------------------------------------------- |
temp_dir_pach: |
rb 4096 |
;--------------------------------------------------------------------- |
file_name: |
rb 4096 |
;--------------------------------------------------------------------- |
file_name_1: |
rb 4096 |
;--------------------------------------------------------------------- |
filename_area: |
rb 256 |
;--------------------------------------------------------------------- |
rb 4096 |
stacktop: |
;--------------------------------------------------------------------- |
Proc_Info process_information |
MEOS_APP_END |
|
;--------------------------------------------------------------------- |
I_END: |
;----------------------------------------------------------------------------- |