Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. ;***************************************************************
  2. ; project name:    PCI Device Enumeration
  3. ; target platform: KolibriOS and MenuetOS
  4. ; compiler:        flat assmebler 1.63.2
  5. ; version:         1.31
  6. ; last update:     13(th) May 2006
  7. ; maintained by:   Jason Delozier (cordata51)
  8. ; e-mail:          cordata51@hotmail.com
  9. ; project site:    http://www.asmfreaks.com/menuetos
  10. ;***************************************************************
  11. ;Summary: This program will attempt to scan the PCI Bus
  12. ;        and display basic information about each device
  13. ;        connected to the PCI Bus.
  14. ;***************************************************************
  15. ;HISTORY:
  16. ;keep dates in european format (dd/mm/yyyy), please
  17. ; '!' means big changes
  18. ; to-do:
  19. ;PCI version should be normalized (0210->02.10)
  20. ;----------------------------------------------------------------
  21. ;1.31: PCIDEV   13/05/2006
  22. ;Author:    Jason Delozier <cordata51@hotmail.com>
  23. ;Features:
  24. ;           fixed
  25. ;                 * ! bug in Company Name look up code that would cause Unknown Name errors.
  26. ;                 * ! possible bugs, many instructions missing byte, word, dword prefixes
  27. ;                 * ! possible bug which could have occured after removing  "PREVIOUSVERSIONLIST"
  28. ;                     entry in loop up code and not fixing jump parameters.
  29. ;           added
  30. ;                 *  comments to various parts of the code
  31. ;           optimized
  32. ;                 * various parts of the source, too many to remember and mention.
  33. ;                 * changed entries for Subclasses in vendors.inc to Byte format, saves a little space.
  34. ;----------------------------------------------------------------
  35. ;1.30: PCIDEV   11/05/2006
  36. ;Author:    Sergey Kuzmin aka Wildwest <kuzmin_serg@list.ru>
  37. ;Features:
  38. ;           added
  39. ;                * 3 new vendor id's (ESS from Madis Kalme and 2 id's
  40. ;                  forgotten from 1.15 release: Broadcom -SiByte and Chaintech Comp.)
  41. ;                       changed
  42. ;                            * I don't know why other devs (Jason or Victor) changed window style
  43. ;                  to old ugly one, so I changed it back to skinned type 3.
  44. ;                * the same goes to the use of macroc.inc - it is enabled again.
  45. ;           deleted
  46. ;                * there is no more label "PREVIOUSVERSIONLIST" - id's moved to the
  47. ;                  appropriate parts of global list.
  48. ;----------------------------------------------------------------
  49. ;1.29: PCIDEV   30/04/2006
  50. ;Author:    Jason Delozier <cordata51@hotmail.com>
  51. ;Features:
  52. ;           fixed
  53. ;                 * ! bug that would not allow devices with device
  54. ;                   numbers > 16 to be displayed.
  55. ;           added
  56. ;                 * ! another heading called "FNC" (function) which allows
  57. ;                   the multipurpose Device/Function varible to be split and
  58. ;                   displayed to the user properly.
  59. ;                 * horizontal bars to display for easier reading.
  60. ;           optimized
  61. ;                 * vendor/description search routines for speed and space.
  62. ;----------------------------------------------------------------
  63. ;1.25: PCIDEV   02/10/2005
  64. ;Author:    Sergey Kuzmin aka Wildwest <kuzmin_serg@list.ru>
  65. ;Features:
  66. ;            changed
  67. ;                                       * ! Description is based on Class and SubClass
  68. ;                     now (PCI 3.0). The Names of Classes and SubClasses
  69. ;                     are in the end of Vendors.inc
  70. ;            deleted
  71. ;                  * label "Descriptions" (names of Classes)
  72. ;
  73. ;----------------------------------------------------------------
  74. ;1.20: PCIDEV   16/08/2005
  75. ;Author:    Victor Alberto Gil Hanla a.k.a. vhanla <vhanla@gmail.com>
  76. ;Features:
  77. ;           added
  78. ;                  * ! many vendor lists (865)
  79. ;           deleted
  80. ;                  * previous version's list
  81. ;           changed
  82. ;                  * previous Company Name searching and printing
  83. ;----------------------------------------------------------------
  84. ;1.15: PCIDEV   03/06/2005
  85. ;Author:    Sergey Kuzmin aka Wildwest <kuzmin_serg@list.ru>
  86. ;Features:
  87. ;           added
  88. ;                                  * quantity of devices,
  89. ;                                  * ! detection of Company Name based on Vendor ID,
  90. ;                                  * database of VenID (35 ID's),
  91. ;                                  * macros.inc for smaller size,
  92. ;           changed
  93. ;                                  * interface+(skinned window),
  94. ;                                  * VenID before DevID in 'table'(was DevID before VenID)
  95. ;----------------------------------------------------------------
  96. ;1.0: PCIDEV    30/01/2005
  97. ;Author:    Jason Delozier
  98. ;Features:
  99. ;          able to
  100. ;                 * detect PCI version,
  101. ;                 * quantity of PCI buses,
  102. ;                 * Vendor&Device ID for appropriate Device on Bus;
  103. ;                 * detect Revision, Class and Subclass of Device,
  104. ;                 * and make Description based on Class
  105. ;-------------------------------------------------------------
  106. use32
  107.  
  108.         org    0x0
  109.  
  110.         db     'MENUET01'; 8 byte id
  111.         dd     0x01      ; header version
  112.         dd     START     ; start of code
  113.         dd     I_END     ; size of image
  114.         dd     0xFFFF    ; memory for app = 64 KB
  115.         dd     I_END     ; esp
  116.         dd     0x0 , 0x0 ; I_Param , I_Icon
  117.  
  118.  
  119. include 'macros.inc'
  120. include 'VENDORS.INC'
  121.  
  122. START:    ; start of execution
  123.      call draw_window
  124.  
  125. still:
  126.     mov  eax,10   ; wait here for event
  127.     int  0x40
  128.  
  129.     cmp  eax,1   ; redraw request ?
  130.     je  red
  131.     cmp  eax,2   ; key in buffer ?
  132.     je  key
  133.     cmp  eax,3   ; button in buffer ?
  134.     je  button
  135.  
  136.     jmp  still
  137.  
  138.   red:    ; redraw
  139.     mov eax, 9              ;window redraw requested so get new window coordinates and size
  140.     mov ebx, Proc_Info      ;area to store process information
  141.     mov ecx, -1             ;
  142.     int 0x40                ;get the process information
  143.     mov eax,[Proc_Info+34]  ;store the window coordinates into the Form Structure
  144.     mov [Form+2], ax        ;x start position
  145.     mov eax,[Proc_Info+38]  ;
  146.     mov [Form+6],ax         ;ystart position
  147.     mov eax,[Proc_Info+42]  ;
  148.     mov [Form],ax           ;window width
  149.     mov eax,[Proc_Info+46]  ;
  150.     mov [Form+4] ,ax        ;window height
  151.     call draw_window        ;go redraw window now
  152.     jmp  still
  153.  
  154.   key:    ; key
  155.     mov  eax,2   ; just read it and ignore
  156.     int  0x40
  157.     jmp  still
  158.   button:   ; button
  159.     mov  eax,17   ; get id
  160.     int  0x40
  161.  
  162.     cmp  ah,1   ; button id=1 ?
  163.     jne  noclose
  164.  
  165.     mov  eax,-1   ; close this program
  166.     int  0x40
  167.   noclose:
  168.     jmp  still
  169.  
  170.  
  171.  
  172.  
  173. ;   *********************************************
  174. ;   *******  WINDOW DEFINITIONS AND DRAW ********
  175. ;   *********************************************
  176. Form:
  177.    dw 780 ;window width
  178.    dw 100 ;window x start
  179.    dw 420 ;window height
  180.    dw 100 ;window y start
  181.  
  182.  
  183.  
  184. draw_window:
  185.  
  186.     mov byte [total],0
  187.  
  188.     mov  eax,12      ; function 12:tell os about windowdraw
  189.     mov  ebx,1       ; 1, start of draw
  190.     int  0x40
  191.     ; DRAW WINDOW
  192.     mov  eax,0                     ; function 0 : define and draw window
  193.     mov  ebx, dword [Form]         ; x/width of window
  194.     mov  ecx, dword [Form+4]       ; y/height of window
  195.     mov  edx,0x03ffffff            ; color of work area RRGGBB,8->color gl
  196.     mov  esi,0x805080d0            ; color of grab bar  RRGGBB,8->color gl
  197.     mov  edi,0x005080d0            ; color of frames    RRGGBB
  198.     int  0x40                      ; draw the window
  199.     ; WINDOW LABEL
  200.     mov  eax,4                     ; function 4 : write text to window
  201.     mov  ebx,8*65536+8             ; [x start] *65536 + [y start]
  202.     mov  ecx,0x10ddeeff            ; font 1 & color ( 0xF0RRGGBB )
  203.     mov  edx,labelt                ; pointer to text beginning
  204.     mov  esi,labellen-labelt       ; text length
  205.     int  0x40
  206.  
  207.     ;draw captions to window
  208.     mov ebx, 20*65536+25           ;x start, ystart of text
  209.     mov ecx, 0x224466              ;color of text
  210.     mov edx, dword PCIWin          ;start of text buffer
  211.     mov esi, 106                   ;lenght of line
  212. newline:                           ;
  213.     mov eax, 4                     ;draw text system function
  214.     int 0x40                       ;draw the text
  215.     add ebx, 10                    ;one line down
  216.     add edx, esi                   ;add lenght of line to offset of text buffer
  217.     cmp byte[edx], byte 'x'        ;is it the end of buffer?
  218.     jne newline                    ;if not draw another line of text
  219.  
  220.     ;Insert horizontal bars  in list area
  221.     mov eax, 13                    ;draw bar system function
  222.     mov ebx, 18                    ;set Xstart position of bar
  223.     shl ebx, 16                    ;
  224.     mov bx,word [Form]             ;get width of window
  225.     sub bx, 32                     ;bar is 32 pixels shorter then window width
  226.     mov ecx, 109*65536+10          ;set Ystart(109) and Height(10) of bar
  227.     mov edx, 0xb6b6b6              ;set color of bar
  228.    again:                          ;begin draw bar loop
  229.     int 0x40                       ;draw bar to window area
  230.     shr ecx, 16                    ;move the Ystart position to working area
  231.     add ecx, 34                    ;add 34 pixels to Y Start (moves bar down)
  232.     cmp cx,word [Form+4]           ;is the Ystart position outside of window area
  233.     jae nomo                       ;if so stop drawing bars
  234.     sub ecx, 14                    ;if not, we only need 20 pixels between bar tops
  235.     shl ecx, 16                    ;set that values as Ystart
  236.     add ecx, 10                    ;Bar Height is always 10 pixels
  237.     jmp again                      ;draw another bar
  238.    nomo:                           ;done drawing bars here
  239.  
  240.     ;start PCI stuff
  241.     call Get_PCI_Info              ;get pci version and last bus
  242.     mov cx,word [PCI_Version]      ;number to draw
  243.     mov eax, 47                    ;draw number system function
  244.     xor esi, esi                   ;color of text
  245.     mov ebx, 0x00040100            ;4 digits to draw in hex format
  246.     mov edx, 110*65536+45          ;x/y start position of number
  247.     int 0x40                       ;draw pci version to window
  248.     mov cl,byte [PCI_LastBus]      ;number to draw
  249.     mov ebx, 0x00020100            ;2 digits hex format
  250.     add edx, 10                    ;one line below pci version
  251.     int 0x40                       ;draw the last bus to window
  252.  
  253.     call scan_Pci                  ;scan for and draw each pci device
  254.  
  255.     movzx ecx, byte [total]        ;number to draw
  256.     mov eax, 47                    ;draw number system function
  257.     mov ebx, 0x00020000            ;2 digits to draw in decimal format
  258.     xor esi, esi                   ;color of text
  259.     mov edx, 150*65536+65          ;x/y position to draw to
  260.     int 0x40                       ;draw total number of devices to window
  261.  
  262.     mov  eax,12                    ; function 12:tell os about windowdraw
  263.     mov  ebx,2                     ; 2, end of draw
  264.     int  0x40
  265.  
  266.     ret
  267. ;   ***********************************************
  268. ;   *******  END WINDOW DEFINITIONS & DRAW  *******
  269. ;   ***********************************************
  270.  
  271.  
  272. ;******************************************************
  273. ;* Gets the PCI Versioin and Last Bus
  274. Get_PCI_Info:
  275.     mov eax, 62
  276.     xor ebx, ebx
  277.     int 0x40
  278.     mov word [PCI_Version], ax
  279.     mov eax, 62
  280.     mov ebx, 1
  281.     int 0x40
  282.     mov byte [PCI_LastBus], al
  283. ret
  284. ;******************************************************
  285.  
  286.  
  287. ;******************************************************
  288. ;* Get all devices on PCI Bus
  289. scan_Pci:
  290.    cmp  byte [PCI_LastBus],0xff ;0xFF means no pci bus found
  291.    jne  Pci_Exists              ;
  292.    ret                          ;if no bus then leave
  293. Pci_Exists:
  294.    mov  byte [V_Bus], 0         ;reset varibles
  295.    mov  byte [V_Dev], 0         ;
  296.    mov  edx,  20*65536+110      ;set start write position
  297. Start_Enum:
  298.    mov  bl, 6                   ;get a dword
  299.    mov  bh, byte [V_Bus]        ;bus of pci device
  300.    mov  ch, byte [V_Dev]        ;device number/function
  301.    mov  cl, 0                   ;offset to device/vendor id
  302.    mov  eax, 62                 ;pci system function
  303.    int  0x40                    ;get ID's
  304.  
  305.    cmp  ax, 0                   ;Vendor ID should not be 0 or 0xFFFF
  306.    je   nextDev                 ;check next device if nothing exists here
  307.    cmp  ax, 0xffff              ;
  308.    je   nextDev                 ;
  309.  
  310.    mov  word [PCI_Vendor], ax   ;There is a device here, save the ID's
  311.    shr  eax, 16                 ;
  312.    mov  word [PCI_Device], ax   ;
  313.    mov  eax, 62                 ;PCI Sys Function
  314.    mov  bl, 4                   ;Read config byte
  315.    mov  bh, byte [V_Bus]        ;Bus #
  316.    mov  ch, byte [V_Dev]        ;Device # on bus
  317.    mov  cl, 0x08                ;Register to read (Get Revision)
  318.    int  0x40                    ;Read it
  319.    mov  byte [PCI_Rev], al      ;Save it
  320.    mov  eax, 62                 ;PCI Sys Function
  321.    mov  cl, 0x0b                ;Register to read (Get class)
  322.    int  0x40                    ;Read it
  323.    mov  byte [PCI_Class], al    ;Save it
  324.    mov  eax, 62                 ;PCI Sys Function
  325.    mov  cl, 0x0a                ;Register to read (Get Subclass)
  326.    int  0x40                    ;Read it
  327.    mov  byte [PCI_SubClass], al ;Save it
  328.    inc  byte [total]            ;one more device found
  329.    call Print_New_Device        ;print device info to screen
  330. nextDev:
  331.    inc  byte [V_Dev]            ;next device on this bus
  332.    jnz  Start_Enum              ;jump until we reach zero
  333.                                 ;(used to be JNO which caused bug!!! 30-4-2006, JMD)
  334.    mov  byte [V_Dev], 0         ;reset device number
  335.    inc  byte [V_Bus]            ;next bus
  336.    mov  al, byte [PCI_LastBus]  ;get last bus
  337.    cmp  byte [V_Bus], al        ;was it last bus
  338.    jbe  Start_Enum              ;if not jump to keep searching
  339. ret
  340. ;******************************************************
  341.  
  342.  
  343.  
  344. ;******************************************************
  345. ;* Print device info to screen
  346. Print_New_Device:
  347.    mov   eax, 47                ;Write number to screen system function
  348.    mov   ebx, 0x00040100        ;4 byte number, print in hexidecimal
  349.    xor   esi, esi               ;Color of text
  350.    movzx ecx,word [PCI_Vendor]  ;Pointer to number to be written
  351.    int   0x40                   ;Write Vendor ID
  352.    and   edx, 0xFFFF            ;*****************************************
  353.    or    edx, 54*65536          ;X start becomes 54
  354.    movzx ecx,word [PCI_Device]  ;get Vendor ID
  355.    int   0x40                   ;Draw Vendor ID to Window
  356.    mov   ebx, 0x00020100        ;2 digit number, in hexidecimal format
  357.    and   edx, 0xFFFF            ;*****************************************
  358.    or    edx, 98*65536          ;X start becomes 98
  359.    movzx ecx,byte [V_Bus]       ;get bus number
  360.    int   0x40                   ;draw bus number to screen
  361.    and   edx, 0xFFFF            ;*****************************************
  362.    or    edx, 128*65536         ;X start becomes 128
  363.    movzx ecx,byte [V_Dev]       ;get device number
  364.    shr   ecx, 3                 ;device number is bits 3-7
  365.    int   0x40                   ;Draw device Number To Window
  366.    and   edx, 0xFFFF            ;*****************************************
  367.    or    edx, 155*65536         ;X start becomes 155
  368.    movzx ecx, byte [V_Dev]      ;get Function number
  369.    and   ecx, 7                 ;function is first 3 bits
  370.    int   0x40                   ;Draw Function Number To Window
  371.    and   edx, 0xFFFF            ;*****************************************
  372.    or    edx, 179*65536         ;X start becomes 179
  373.    movzx ecx,byte [PCI_Rev]     ;get revision number
  374.    int   0x40                   ;Draw Revision to screen
  375.    and   edx, 0xFFFF            ;*****************************************
  376.    or    edx, 215*65536         ;X start becomes 215
  377.    movzx ecx,byte [PCI_Class]   ;get PCI_Class
  378.    int   0x40                   ;Draw Class to screen
  379.    and   edx, 0xFFFF            ;*****************************************
  380.    or    edx, 266*65536         ;X start becomes 266
  381.    movzx ecx,byte [PCI_SubClass];get sub class
  382.    int   0x40                   ;Draw Sub Class to screen
  383.    ;Write Names
  384.    movzx ebx, dx                ;Set y position
  385.    or    ebx, 310*65536         ;set Xposition to 310
  386.  
  387. ;**********************************************************
  388. ;Prints the Vendor's Name based on Vendor ID
  389. ;
  390. ; modified part by vhanla (I know it is not a fastest way to search)
  391. ; it needs optimization... HELP this project!
  392. ;
  393. ; Modified on 30-04-2006 by JMD for size
  394. ;-----------------------------------------------------------------------------
  395.     ;first determine which list to find the vendor in
  396.     mov ax, word [PCI_Vendor]
  397.     mov ecx, 255           ;# vendors in most lists
  398.     cmp ax,4800            ;Check if Vendor's value is less than this number
  399.     jae next1              ;if it is less, let's continue, or jump to next1
  400.       mov edx, _FIRSTPART  ;select this list
  401.       jmp rep1             ;start searching list
  402.   next1:                   ;
  403.     cmp ax,5314            ;same thing happening here as above^
  404.     jae next2              ;
  405.       mov edx, _SECONDPART ;
  406.       jmp rep1             ;
  407.   next2:                   ;
  408.     cmp ax,5574            ;
  409.     jae next3              ;
  410.       mov edx, _THIRDPART  ;
  411.       jmp rep1             ;
  412.   next3:                   ;
  413.       mov ecx, 110         ;only 110 vendors in this list
  414.       mov edx, _FOURTHPART ;
  415.  
  416.   rep1:
  417.    cmp ax,word[edx+50]     ;are Vendor ID's the same?
  418.    je  ex                  ;if so jump to print the description to screen
  419.    add edx, 52             ;if not put us at start of next description
  420.    dec ecx                 ;one less description in list
  421.    jnz rep1                ;was it our last?
  422.    mov edx, _UNKNOWN       ;if so we dont know this Vendor
  423.  
  424.  ex:
  425.   ;lets print the vendor Name
  426.    xor ecx, ecx            ;font color
  427.    mov eax,4               ;OS CMD
  428.    mov esi,50              ;Length of text
  429.    int 0x40                ;Print the text
  430. ;------------------------------------------------------------------
  431.  
  432. ;------------------------------------------------------------------
  433. ;Get description based on Class/Subclass
  434.    cmp   byte [PCI_Class], 11h    ;we only know of 17 classes
  435.    ja    endd                     ;if its more then, its unknown to us, so jump
  436.    movzx eax, byte [PCI_Class]    ;load our class
  437.    shl   eax, 3                   ;multiply for jump table
  438.    mov   ecx, [ClassList+eax+4]   ;number of descriptions for this class
  439.    mov   edx, [ClassList+eax]     ;start of description list for class
  440.    movzx eax, byte [PCI_SubClass] ;get subclass
  441.  repu1:
  442.    cmp   al,byte[edx+32]          ;are subclasses the same?
  443.    je    endd                     ;if so jump to print the description to screen
  444.    add   edx, 33                  ;if not put us at start of next description
  445.    dec   ecx                      ;one less description in list
  446.    jnz   repu1                    ;was it our last?
  447.    mov   edx,_UNKNOWND            ;if so its unknown device
  448.  endd:
  449.    and   ebx, 0x0000FFFF          ;clear X position
  450.    or    ebx, 0x02300000          ;set X position to 560 pixels
  451.    xor   ecx, ecx                 ;color of text
  452.    mov   eax,4                    ;draw text system function
  453.    mov   esi,32                   ;length of text to draw
  454.    int   0x40                     ;draw the text
  455.  
  456.    movzx edx, bx                  ;get y coordinate
  457.    add   edx, 0x0014000A          ;add 10 to y coordinate and set x coordinate to 20
  458. ret
  459.  
  460. ClassList:
  461.  dd Class0 ,  2, Class1 , 8, Class2,  8, Class3, 4
  462.  dd Class4 ,  4, Class5 , 3, Class6, 12, Class7, 7
  463.  dd Class8 ,  8, Class9 , 6, ClassA,  2, ClassB, 7
  464.  dd ClassC , 10, ClassD , 8, ClassE,  1, ClassF, 4
  465.  dd Class10,  3, Class11, 5
  466. ;------------------------------------------------------------------
  467.  
  468.  
  469.  
  470. ; DATA AREA
  471.  
  472. labelt:
  473. db 'PCI Device Enumeration v 1.31 by J. Delozier, S. Kuzmin and V. Hanla'
  474.  labellen:
  475.  
  476. PCIWin:
  477. db 'Please remember to enable PCI Access to Applications in Setup Menu.'
  478. db '                                       '
  479. db '                                                                   '
  480. db '                                       '
  481. db 'PCI Version  =                                                     '
  482. db '                                       '
  483. db 'Last PCI Bus =                                                     '
  484. db '                                       '
  485. db 'Quantity of devices =                                              '
  486. db '                                       '
  487. db '                                                                   '
  488. db '                                       '
  489. db 'VenID DevID Bus# Dev# Fnc Rev  Class  Subclass                 Comp'
  490. db 'any                      Description   '
  491. db '----- ----- ---- ---- --- ---  -----  -------- --------------------'
  492. db '---------------------- ----------------'
  493. db 'x'
  494.  
  495. total        db 0
  496. V_Bus        db 0
  497. V_Dev        db 0
  498. PCI_Version  dw 0
  499. PCI_LastBus  db 0
  500. PCI_Device   dw 0
  501. PCI_Vendor   dw 0
  502. PCI_Bus      db 0
  503. PCI_Dev      db 0
  504. PCI_Rev      db 0
  505. PCI_Class    db 0
  506. PCI_SubClass db 0
  507.  
  508.  
  509. Proc_Info:
  510.  times 1024 db 0
  511.  
  512. I_END: