Subversion Repositories Kolibri OS

Rev

Rev 2057 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ;***************************************************************
  2. ; project name:    PCI Device Enumeration
  3. ; target platform: KolibriOS
  4. ; compiler:        flat assembler 1.68
  5. ; version:         2.3
  6. ; last update:     Jule 2011
  7. ; maintained by:   Jason Delozier <cordata51@hotmail.com>
  8. ;                  Sergey Kuzmin <kuzmin_serg@list.ru>
  9. ;                  Mihailov Ilia <ghost.nsk@gmail.com>
  10. ;                  Marat Zakiyanov <mario79@bk.ru>
  11. ;                  Artem Jerdev  <art_zh@yahoo.com>
  12. ;                  Evgeny Grechnikov (diamond)
  13. ;                  Veronica (CleverMouse)
  14. ; old project site:  http://www.coolthemes.narod.ru/pcidev.html
  15. ; new project site:  http://board.kolibrios.org/viewtopic.php?f=42&t=73
  16. ;***************************************************************
  17. ;Summary: This program will attempt to scan the PCI Bus
  18. ;        and display basic information about each device
  19. ;        connected to the PCI Bus.
  20. ;***************************************************************
  21. ;-----------------------------------------------------------------------------
  22. include '../../../macros.inc'
  23.  
  24. include '../../../develop/libraries/box_lib/load_lib.mac'
  25. ;-----------------------------------------------------------------------------
  26.         use32
  27.         org 0x0
  28.         db 'MENUET01'   ; 8 byte id
  29.         dd 0x01         ; header version
  30.         dd START        ; start of code
  31.         dd IM_END       ; size of image
  32.         dd I_END        ; memory for app
  33.         dd stacktop     ; esp
  34.         dd 0    ; I_Param
  35.         dd path         ; APPLICATION PATH
  36. ;-----------------------------------------------------------------------------
  37. @use_library    ; load_lib macro
  38. ;-----------------------------------------------------------------------------
  39. START:
  40.         mcall   68,11
  41.         mcall   66,1,1
  42. ;-----------------------------------------------------------------------------
  43. load_libraries l_libs_start,end_l_libs
  44. ;-----------------------------------------------------------------------------
  45. ;OpenDialog     initialisation
  46.         push    dword OpenDialog_data
  47.         call    [OpenDialog_Init]
  48.        
  49.         mov     edi,filename_area
  50.         mov     esi,start_temp_file_name
  51.         call    copy_file_name_path
  52. ;-----------------------------------------------------------------------------
  53.         mcall   68,12,4096*4 ; 16 Kb - I hope this will be enough for store of data
  54.         mov     [store_text_area_start],eax
  55. ;----------------------------------------------------------------------------- 
  56.         call draw_window
  57. still:
  58.         mcall   10                      ; wait here for event
  59.         dec     eax                     ; redraw request ?
  60.         jz      red
  61.         dec     eax                     ; key in buffer ?
  62.         jz      key
  63.         dec     eax                     ; button in buffer ?
  64.         jz      button
  65.         jmp     still
  66. ;-----------------------------------------------------------------------------
  67. red:                                    ; redraw
  68.         call    get_window_param
  69.         mov     eax, [Proc_Info.box.left]; store the window coordinates into the Form Structure
  70.         mov     [Form + 2], ax          ; x start position
  71.         mov     eax, [Proc_Info.box.top];
  72.         mov     [Form + 6], ax          ; ystart position
  73.         mov     eax, [Proc_Info.box.width]      ;
  74.         mov     [Form], ax              ; window width
  75.         mov     eax, [Proc_Info.box.height]     ;
  76.         mov     [Form + 4] ,ax          ; window height
  77.         call    draw_window             ; go redraw window now
  78.         jmp     still
  79. ;-----------------------------------------------------------------------------
  80. key:                                    ; key
  81.         mcall   2                       ; just read it and ignore
  82.         cmp     [extended_key],1
  83.         je      .extended_key
  84.         test    al, al
  85.         jnz     still
  86.         cmp     ah, 0xE0
  87.         jne     @f
  88.         mov     [extended_key],1
  89.         jmp     still
  90. @@:
  91.         cmp     ah,129  ; Esc
  92.         je      button.exit
  93.         cmp     ah,159
  94.         je      call_OpenDialog
  95.         jmp     still
  96. .extended_key:
  97.         mov     [extended_key],0
  98.         cmp     ah,129  ; Esc
  99.         je      button.exit
  100.         cmp     ah,159
  101.         je      call_OpenDialog
  102.         jmp     still
  103. ;-----------------------------------------------------------------------------
  104. button:                                 ; button
  105.         mcall   17                      ; get id
  106.         cmp     ah,2
  107.         je      call_OpenDialog
  108.         cmp     ah, 1                   ; button id = 1 ?
  109.         jne     still
  110. .exit:
  111.         mcall   -1                      ; close this program
  112. ;-----------------------------------------------------------------------------
  113. call_OpenDialog:
  114.         mov     [OpenDialog_data.type],1        ; Save
  115.        
  116.         push    dword OpenDialog_data
  117.         call    [OpenDialog_Start]
  118.  
  119.         cmp     [OpenDialog_data.status],2      ; OpenDialog does not start
  120.         je      .save_file_default_path
  121.        
  122.         cmp     [OpenDialog_data.status],1
  123.         jne     still
  124.        
  125.         call    store_data
  126.         jmp     still
  127. ;----------------------------------------      
  128. .save_file_default_path:
  129.         mov     edi,file_name
  130.         mov     esi,file_default_path
  131.         call    copy_file_name_path
  132.         call    store_data
  133.         jmp     still
  134. ;----------------------------------------      
  135. copy_file_name_path:
  136.         xor     eax,eax
  137.         cld
  138. @@:
  139.         lodsb
  140.         stosb
  141.         test    eax,eax
  142.         jnz     @r
  143.         ret
  144. ;-----------------------------------------------------------------------------
  145. prepare_text_area:
  146.         mov     edi,[store_text_area_start]
  147.  
  148.         push    edi
  149.         mov     ecx,4096 ; 16 Kb - I hope this will be enough for store of data
  150.         mov     eax,dword '    '
  151.         cld
  152.         rep     stosd
  153.         pop     edi
  154.        
  155.         mov     esi,PCIWin
  156.         xor     ecx,ecx
  157. @@:
  158.         mov     cl,[esi]
  159.         inc     esi
  160.         rep     movsb
  161.         mov     al,0Ah ; CR - carriage return
  162.         stosb
  163.         cmp     [esi],byte 0xFF
  164.         jne     @r     
  165.  
  166.         mov     [store_text_area_end],edi
  167.        
  168.         xor     edi,edi
  169.         ret
  170. ;-----------------------------------------------------------------------------         
  171. get_window_param:
  172.         mcall   9, Proc_Info, -1        ; window redraw requested so get
  173.                                         ; new window coordinates and size
  174.         ret
  175. ;----------------------------------------------------------------------------- 
  176. draw_window:
  177.         call    prepare_text_area
  178.        
  179.         mov     byte [total], 0
  180.         mcall   12, 1                   ; start of draw
  181.         ; DRAW WINDOW
  182.         mcall   0,dword [Form],dword [Form + 4],0x13ffffff,0x805080d0,title
  183.        
  184.         call    get_window_param
  185.        
  186.         mov     eax,[Proc_Info+70] ;status of window
  187.         test    eax,100b
  188.         jne     .end
  189.        
  190.         mcall   8,<450,100>,<25,25>,2,0xC0C0C0
  191.         shr     ecx,16
  192.         mov     bx,cx
  193.         add     ebx,13 shl 16+4
  194.         mcall   4,,0x80000000,text_save_button
  195.         add     bx,11
  196.         mcall   ,,,text_save_button.1
  197.         ; Insert horizontal bars  in list area
  198.         mov     eax, 13                 ; draw bar system function
  199.         mov     ebx, 18                 ; set Xstart position of bar
  200.         shl     ebx, 16                 ;
  201.         mov     bx, word [Form] ; get width of window
  202.         sub     bx, 32                  ; bar is 32 pixels shorter then window width
  203.         mov     ecx, 119 * 65536 + 10   ; set Ystart(109) and Height(10) of bar   109
  204.         mov     edx, 0xC0C0C0           ; set color of bar
  205. .again: ;begin draw bar loop
  206.         mcall                           ; draw bar to window area
  207.         shr     ecx, 16                 ; move the Ystart position to working area
  208.         add     ecx, 34                 ; add 34 pixels to Y Start (moves bar down)
  209.         cmp     cx, word [Form + 4]     ; is the Ystart position outside of window area
  210.         jae     .nomo                   ; if so stop drawing bars
  211.         sub     ecx, 14                 ; if not, we only need 20 pixels between bar tops
  212.         shl     ecx, 16                 ; set that values as Ystart
  213.         add     ecx, 10                 ; Bar Height is always 10 pixels
  214.         jmp     .again                  ; draw another bar
  215. ;-----------------------------------------------------------------------------
  216. .nomo:                                  ;done drawing bars here
  217.         ; start PCI stuff
  218.         call    Get_PCI_Info            ; get pci version and last bus, scan for and draw each pci device
  219.  
  220.         ; Window inteface
  221.         mov     cx, [PCI_Version]
  222.         add     ch, '0'
  223.         mov     [PCIWin + 85], ch       ; 0xBADCODE but it works !
  224.         mov     ch, cl
  225.         shr     cl, 4
  226.         and     ch, 0x0f
  227.         add     cx, '00'
  228.         mov     [PCIWin + 87], cx
  229.         mov     cl, [PCI_LastBus]       ; will only work if [PCI_LastBus] < 10
  230.         add     cl, '0'
  231.         mov     [PCIWin + 106], cl
  232.  
  233.         mov     edx, PCIWin
  234.         mov     ebx, 20 * 65536 + 25    ; x start, ystart of text
  235.         mov     ecx, 0x224466           ; color of text
  236.         mov     eax, 4
  237. @@:
  238.         movzx   esi, byte[edx]
  239.         inc     edx
  240.         mcall
  241.         add     ebx, 10
  242.         add     edx, esi
  243.         cmp     byte[edx], -1
  244.         jne     @b
  245.         ; Quantity of devices...
  246.         movzx   ecx, byte [total]       ; number to draw
  247.         mcall   47, 0x00020000,,150 * 65536 + 65, 0x224466
  248.        
  249.         mov     ebx,ecx
  250.         mov     ecx,2
  251.         mov     edi,[store_text_area_start]
  252.         add     edi,157
  253.         push    edi
  254.         call    binary_to_hex_string
  255.         pop     edi
  256.         mov     [edi+2],byte 'h'
  257.        
  258.         mov     ah, [MMIO_allowed]
  259.         or      ah, ah
  260.         jz      @f
  261.         mov     ah, [MMIO_Bus]  ; =255 if MMIO disabled / not found
  262.         and     ah, 0x7f
  263.         inc     ah
  264.         jo      @f     
  265.         call    Try_MMIO
  266. @@:
  267. .end:
  268.         mcall   12, 2                   ; end of draw
  269.         ret
  270. ;-----------------------------------------------------------------------------
  271. store_data:
  272.         mov     eax,[store_text_area_start]
  273.         mov     [fileinfo.return],eax
  274.         mov     ebx,[store_text_area_end]
  275.         sub     ebx,eax
  276.         inc     ebx
  277.         mov     [fileinfo.size],ebx
  278.         mcall   70,fileinfo
  279.         ret
  280. ;-----------------------------------------------------------------------------
  281. ;* Gets the PCI Version and Last Bus
  282. Get_PCI_Info:
  283.         mcall   62, 0
  284.         mov     word [PCI_Version], ax
  285.         mcall   62, 1
  286.         mov     byte [PCI_LastBus], al
  287.         ;----------------------------------------------------------
  288.         ;* Get all devices on PCI Bus
  289.         cmp     al, 0xff                ; 0xFF means no pci bus found
  290.         jne     Pci_Exists              ;
  291.         ret                             ; if no bus then leave
  292. ;----------------------------------------------------------------------------- 
  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.         mcall   62                      ; get ID's
  303.  
  304.         cmp     ax, 0                   ; Vendor ID should not be 0 or 0xFFFF
  305.         je      nextDev                 ; check next device if nothing exists here
  306.        
  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     bl, 4                   ; Read config byte
  314.         mov     bh, byte [V_Bus]        ; Bus #
  315.         mov     ch, byte [V_Dev]        ; Device # on bus
  316.         mov     cl, 0x08                ; Register to read (Get Revision)
  317.         mcall   62                      ; Read it
  318.        
  319.         mov     byte [PCI_Rev], al      ; Save it
  320.         mov     cl, 0x0b                ; Register to read (Get class)
  321.         mcall   62                      ; Read it
  322.  
  323.         mov     byte [PCI_Class], al    ; Save it
  324.         mov     cl, 0x0a                ; Register to read (Get Subclass)
  325.         mcall   62                      ; Read it
  326.         mov     byte [PCI_SubClass], al; Save it
  327. ; by Mario79 august 2006
  328.         mov     cl, 0x09                ; Register to read (Get Interface)
  329.         mcall   62                      ; Read it
  330.        
  331.         mov  [PCI_Interface], al        ; Save it
  332. ;
  333. ; by Ghost april 2007
  334.         mov     cl, 0x3c                ; Register to read (Get IRQ)
  335. @@:
  336.         mcall   62                      ; Read it
  337.        
  338.         mov     [PCI_IRQ], al           ; Save it
  339. ; by CleverMouse juny 2011
  340.         mov     cl, 0x0e
  341.         mcall   62
  342.        
  343.         push    eax
  344.         inc     byte [total]            ; one more device found
  345.         call    Print_New_Device        ; print device info to screen
  346. ; don't scan for nonzero functions if zero function says "not multifunction device"
  347.         pop     eax
  348.         test    al, al
  349.         js      nextDev
  350.        
  351.         test    byte [V_Dev], 7
  352.         jnz     nextDev
  353.        
  354.         or      byte [V_Dev], 7
  355. nextDev:
  356.         inc     byte [V_Dev]            ; next device on this bus
  357.         jnz     Start_Enum              ; jump until we reach zero
  358.         ;(used to be JNO which caused bug!!! 30-4-2006, JMD)
  359.         mov     byte [V_Dev], 0         ; reset device number
  360.         inc     byte [V_Bus]            ; next bus
  361.         mov     al, byte [PCI_LastBus]  ; get last bus
  362.         cmp     byte [V_Bus], al        ; was it last bus
  363.         jbe     Start_Enum              ; if not jump to keep searching
  364.         ret
  365. ;-----------------------------------------------------------------------------
  366. no_ummio_allowed:
  367.         xor     al,al
  368.         mov     [MMIO_allowed],al               ; re-enter the subroutine
  369. ;------------------------------------------------------------------
  370. ;* Print device info to screen
  371.  
  372. Print_New_Device:
  373.         xor     esi, esi                ; default text color
  374.         mov     cl, [MMIO_allowed]
  375.         or      cl,cl
  376.         jz      no_ummio_here
  377.         mov     ch, byte [V_Bus]
  378.         mov     cl, byte [V_Dev]
  379.         mcall   62, 11          ; detect uMMIO
  380.        
  381.         and     ax,0x7fff
  382.         inc     ax                      ; -1 returned?
  383.         jo      no_ummio_allowed
  384.        
  385.         inc     ax                      ; -2 returned?
  386.         jo      no_ummio_here
  387.        
  388.         inc     ax                      ; -3 returned?
  389.         jo      no_ummio_here
  390.        
  391.         mov     esi, 0x990033   ; highlighted text color
  392.         mov     bh, byte [V_Bus]
  393.         mov     bl, byte [V_Dev]
  394.         mov     byte [MMIO_Bus], bh
  395.         mov     byte [MMIO_Dev], bl
  396.         add     bh,'0'
  397.         mov     [PCIWin + 129], bh      ; uMMIO bus
  398.         mov     al, bl
  399.         shr     al, 1
  400.         shr     al, 1
  401.         shr     al, 1
  402.         add     al,'0'
  403.         mov     [PCIWin + 131], al      ; uMMIO device
  404.         and     bl, 7
  405.         add     bl, '0'
  406.         mov     [PCIWin + 133], bl      ; uMMIO function
  407.  
  408. no_ummio_here:
  409.         movzx   ecx,word [PCI_Vendor]   ; Pointer to number to be written
  410.         mcall   47, 0x00040100          ; Write Vendor ID
  411.        
  412.         call    store_4_digits
  413.        
  414.         and     edx, 0xFFFF             ;*****************************************
  415.         or      edx, 54 * 65536 ; X start becomes 54
  416.         movzx   ecx, word [PCI_Device]  ; get Vendor ID
  417.         mcall                           ; Draw Vendor ID to Window
  418.  
  419.         call    store_4_digits
  420.        
  421.         and     edx, 0xFFFF             ;*****************************************
  422.         or      edx, 98 * 65536 ; X start becomes 98
  423.         movzx   ecx, byte [V_Bus]       ; get bus number
  424.         mcall   ,0x00020100             ; draw bus number to screen
  425.  
  426.         call    store_2_digits
  427.        
  428.         and     edx, 0xFFFF             ;*****************************************
  429.         or      edx, 128 * 65536        ; X start becomes 128
  430.         movzx   ecx, byte [V_Dev]       ; get device number
  431.         shr     ecx, 3                  ; device number is bits 3-7
  432.         mcall                           ; Draw device Number To Window
  433.  
  434.         call    store_2_digits
  435.        
  436.         and     edx, 0xFFFF             ;*****************************************
  437.         or      edx, 155 * 65536        ; X start becomes 155
  438.         movzx   ecx, byte [V_Dev]       ; get Function number
  439.         and     ecx, 7                  ; function is first 3 bits
  440.         mcall                           ; Draw Function Number To Window
  441.        
  442.         call    store_2_digits
  443.        
  444.         and     edx, 0xFFFF             ;*****************************************
  445.         or      edx, 179 * 65536        ; X start becomes 179
  446.         movzx   ecx, byte [PCI_Rev]     ; get revision number
  447.         mcall                           ; Draw Revision to screen
  448.        
  449.         call    store_2_digits
  450.        
  451.         and     edx, 0xFFFF             ;*****************************************
  452.         or      edx, 215*65536          ; X start becomes 215
  453.         movzx   ecx, byte [PCI_Class]   ; get PCI_Class
  454.         mcall                           ; Draw Class to screen
  455.        
  456.         call    store_2_digits
  457.        
  458.         and     edx, 0xFFFF             ;*****************************************
  459.         or      edx, 250*65536          ; X start becomes 250
  460.         movzx   ecx, byte [PCI_SubClass]; get sub class
  461.         mcall                           ; Draw Sub Class to screen
  462.        
  463.         call    store_2_digits
  464.        
  465. ; from Mario79 august 2006
  466.         and     edx, 0xFFFF             ;*****************************************
  467.         or      edx, 280 * 65536        ; X start becomes 280
  468.         movzx   ecx, [PCI_Interface]    ; get Interface
  469.         mcall
  470.        
  471.         call    store_2_digits
  472.        
  473. ;
  474. ; from Ghost april 2007                 ;*****************************************
  475.         and     edx, 0xFFFF
  476.         or      edx, 310 * 65536        ; X start becomes 310
  477.         movzx   ecx, [PCI_IRQ]          ; get Interface
  478.         cmp     cl, 23                  ; IRQ between 0..23
  479.         ja      @f
  480.  
  481.         mcall
  482.  
  483.         call    store_2_digits
  484.         jmp     .PCI_Vendor
  485. @@:    
  486.         call    store_NA
  487. .PCI_Vendor:
  488.         ;Write Names
  489.         movzx   ebx, dx         ; Set y position
  490.         or      ebx, 340 * 65536        ; set Xposition to 340
  491.  
  492. ;------------------------------------------------------------------
  493. ; Prints the Vendor's Name based on Vendor ID
  494. ;
  495. ; Modified on ??-04-2007 by Ghost for size
  496. ;------------------------------------------------------------------
  497.         mov     edx, VendorsTab
  498.         mov     cx, word[PCI_Vendor]
  499.  
  500. .fn:
  501.         mov     ax, [edx]
  502.         add     edx, 6
  503.         test    ax, ax
  504.         jz      .find
  505.        
  506.         cmp     ax, cx
  507.         jne     .fn
  508.        
  509. .find:
  510.         mov     edx, [edx - 4]
  511.         mcall   4,, 0x80000000          ; lets print the vendor Name
  512.        
  513.         mov     [store_text_size],42
  514.         call    store_text
  515. ;------------------------------------------------------------------
  516. ; Get description based on Class/Subclass
  517. ;
  518. ; Modified on ??-04-2007 by Ghost for size
  519. ;------------------------------------------------------------------
  520.         mov     eax, dword [PCI_Class]
  521.         and     eax, 0xffffff
  522.         xor     edx, edx
  523.         xor     esi, esi
  524. .fnc:
  525.         inc     esi
  526.         mov     ecx, [Classes + esi * 8 - 8]
  527.         cmp     cx, 0xffff
  528.         je      .endfc
  529.        
  530.         cmp     cx, ax
  531.         jne     .fnc
  532.        
  533.         test    ecx, 0xff000000
  534.         jz      @f
  535.        
  536.         mov     edx, [Classes + esi * 8 - 4]
  537.         jmp     .fnc
  538. @@:
  539.         cmp     eax, ecx
  540.         jne     .fnc
  541.        
  542.         xor     edx, edx
  543. .endfc:
  544.         test    edx, edx
  545.         jnz     @f
  546.        
  547.         mov     edx, [Classes + esi * 8 - 4]
  548. @@:
  549.         and     ebx, 0x0000FFFF         ; clear X position
  550.         or      ebx, 0x24E0000          ; set X position to 590 pixels
  551.         mcall   4,, 0x80000000,, 32     ; draw the text
  552.        
  553.         mov     [store_text_size],0
  554.         call    store_text
  555.         call    store_CR
  556.        
  557.         movzx   edx, bx         ; get y coordinate
  558.         add     edx, 0x0014000A         ; add 10 to y coordinate and set x coordinate to 20
  559.         mov     [gr_pos], edx
  560.         ret
  561. ;------------------------------------------------------------------
  562. ; Get the user-MMIO related info
  563. ;
  564. ; Added on ??-12-2009 by art_zh
  565. ;------------------------------------------------------------------
  566. Try_MMIO:
  567.         xor     ebx, ebx
  568.         mov     edx, ebx
  569.         mov     bh, [MMIO_BAR]
  570.         or      bx, 12                  ; function 12
  571.         mov     ecx, 4096               ; =1 page to map
  572.         mcall   62
  573.        
  574.         mov     [MMIO_Map], eax         ; store MMIO lin.addr.
  575.         mov     ecx, 0x80990022         ; print color : red
  576.         add     bh, '0'
  577.         cmp     eax, -3
  578.         jne     @f
  579.        
  580.         mov     [bar_um+3], bh
  581.         mov     ebx, [gr_pos]
  582.         mov     edx, bar_um
  583.         mcall   4
  584.        
  585.         jmp     mmio_next_bar
  586. @@:
  587.         cmp     eax, -4
  588.         jne     @f
  589.         mov     [bar_io+3], bh
  590.         mov     ebx, [gr_pos]
  591.         mov     edx, bar_io
  592.         mcall   4
  593.        
  594.         jmp     mmio_next_bar
  595. @@:
  596.         cmp     bh, '6'         ; expansion ROM ?
  597.         je      @f
  598.         mov     [bar_ram+3], bh
  599.         mov     ebx, [gr_pos]
  600.         mov     edx, bar_ram
  601.         mcall   4
  602.        
  603.         jmp     mmio_dump
  604. ;-----------------------------------------------------------------------------
  605. @@:
  606.         mov     ebx, [gr_pos]
  607.         mov     edx, bar_rom
  608.         mcall   4
  609.  
  610. mmio_dump:
  611.         mov     edx, [MMIO_Map]
  612.         mov     esi, 64
  613.         mov     ecx, 0x099              ; dump color : blue
  614.         add     ebx, 10
  615.         mov     [gr_pos], ebx
  616.         mcall   4
  617.        
  618.         mov     ecx, [MMIO_Map]         ; release the tried page
  619.         mcall   62,13
  620.  
  621. mmio_next_bar:
  622.         mov     bh, [MMIO_BAR]
  623.         inc     bh
  624.         cmp     bh,7
  625.         je      @f
  626.        
  627.         mov     [MMIO_BAR], bh
  628.         add     [gr_pos], 10
  629.         jmp     Try_MMIO
  630. ;-----------------------------------------------------------------------------
  631. @@:
  632.         xor     bh,bh
  633.         mov     [MMIO_BAR], bh
  634.         ret
  635. ;-----------------------------------------------------------------------------
  636. store_CR:
  637.         pusha
  638.         mov     edi,[store_text_area_end]
  639.         mov     [edi],word 0A20h ; CR (carriage return) + SPACE
  640.         add     dword [store_text_area_end],2
  641.         popa
  642.         ret    
  643. ;-----------------------------------------------------------------------------
  644. store_text:
  645.         pusha
  646.         inc     dword [store_text_area_end]
  647.         mov     esi,edx
  648.         mov     edi,[store_text_area_end]
  649.         push    edi
  650.         xor     eax,eax
  651.         cld
  652. @@:
  653.         lodsb
  654.         test    eax,eax
  655.         jz      @f
  656.         stosb
  657.         inc     dword [store_text_area_end]
  658.         jmp     @r
  659. @@:
  660.         pop     esi
  661.         mov     eax,[store_text_size]
  662.         test    eax,eax
  663.         jz      @f
  664.         sub     edi,esi
  665.         sub     eax,edi
  666.         add     [store_text_area_end],eax
  667. @@:
  668.         popa
  669.         ret    
  670. ;-----------------------------------------------------------------------------
  671. store_NA:
  672.         pusha
  673.         mov     ebx,edx
  674.         mcall   4,,0x80000000,text_NA
  675.         mov     edi,[store_text_area_end]
  676.         mov     ax,[edx]
  677.         mov     [edi+1],ax
  678.         add     [store_text_area_end],dword 5
  679.         popa
  680.         ret
  681. ;-----------------------------------------------------------------------------
  682. store_2_digits:
  683.         pusha
  684.         inc     [store_text_area_end]
  685.         mov     ebx,ecx
  686.         mov     ecx,2
  687.         mov     edi,[store_text_area_end]
  688.         call    binary_to_hex_string
  689.         add     [store_text_area_end],dword 4
  690.         popa
  691.         ret
  692. ;-----------------------------------------------------------------------------
  693. store_4_digits:
  694.         pusha
  695.         mov     ebx,ecx
  696.         mov     ecx,4
  697.         mov     edi,[store_text_area_end]
  698.         call    binary_to_hex_string
  699.         add     [store_text_area_end],dword 6
  700.         popa
  701.         ret
  702. ;-----------------------------------------------------------------------------
  703. ; ebx - value
  704. ; ecx - digits
  705. ; edi - output string
  706. binary_to_hex_string:
  707.         add     edi,ecx
  708.         dec     edi
  709.         std
  710. .1:
  711.         mov     al,bl
  712.         and     al,0xf
  713.         shr     ebx,4
  714.         cmp     al,9
  715.         jbe     @f
  716.  
  717.         add     al,0x27
  718. @@:
  719.         add     al,0x30
  720.         stosb
  721.         dec     ecx
  722.         jnz     .1
  723.         cld
  724.         ret
  725. ;-----------------------------------------------------------------------------
  726. include 'vendors.inc'
  727. ;-----------------------------------------------------------------------------
  728. ; DATA AREA
  729. DATA
  730.  
  731. Form:   dw 800 ; window width (no more, special for 800x600)
  732.         dw 100 ; window x start
  733.         dw 620 ; window height
  734.         dw 20 ; window y start
  735.  
  736. title   db 'PCI Device Enumerator v 2.3', 0
  737.  
  738. PCIWin mls \
  739.         '   Don`t forget to enable PCI Access to Applications in Setup Menu.',\
  740.         '',\
  741.         'PCI Version  = x.xx; Last PCI Bus = x',\
  742.         'User MMIO channel = 0F.F:F ',\
  743.         'Number of PCI units =    ',\
  744.         '',\
  745.         'VenID DevID Bus# Dev# Fnc Rev  Class  Subclass/ IRQ                 Company                      Description',\
  746.         '                                      Interface',\
  747.         '----- ----- ---- ---- --- ---  -----  --------- --- ------------------------------------------ --------------------------------'
  748.  
  749. bar_ram db 'BARx: MMIO block', 0
  750. bar_io  db 'BARx: IO ports',0
  751. bar_um  db 'BARx: unmapped',0
  752. bar_rom db 'BAR6: Expansion ROM', 0
  753.  
  754. text_save_button:
  755.         db 'Save PCI list',0
  756. .1:     db '(Press S key)',0
  757.  
  758. text_NA:
  759.         db '--',0
  760. ;---------------------------------------------------------------------
  761. system_dir_ProcLib      db '/sys/lib/proc_lib.obj',0
  762.  
  763. err_message_found_lib2  db 'proc_lib.obj - Not found!',0
  764.  
  765. err_message_import2     db 'proc_lib.obj - Wrong import!',0
  766.  
  767. head_f_i:
  768. head_f_l        db 'error',0
  769. ;---------------------------------------------------------------------
  770. l_libs_start:
  771.  
  772. library02  l_libs system_dir_ProcLib+9, path, library_path, system_dir_ProcLib, \
  773. err_message_found_lib2, head_f_l, ProcLib_import, err_message_import2, head_f_i
  774.  
  775. end_l_libs:
  776. ;---------------------------------------------------------------------
  777. align 4
  778. ProcLib_import:
  779. OpenDialog_Init         dd aOpenDialog_Init
  780. OpenDialog_Start        dd aOpenDialog_Start
  781. ;OpenDialog__Version    dd aOpenDialog_Version
  782.         dd      0
  783.         dd      0
  784. aOpenDialog_Init        db 'OpenDialog_init',0
  785. aOpenDialog_Start       db 'OpenDialog_start',0
  786. ;aOpenDialog_Version    db 'Version_OpenDialog',0
  787. ;---------------------------------------------------------------------
  788. align 4
  789. OpenDialog_data:
  790. .type                   dd 0
  791. .procinfo               dd Proc_Info    ;+4
  792. .com_area_name          dd communication_area_name      ;+8
  793. .com_area               dd 0    ;+12
  794. .opendir_pach           dd temp_dir_pach        ;+16
  795. .dir_default_pach       dd communication_area_default_pach      ;+20
  796. .start_path             dd open_dialog_path     ;+24
  797. .draw_window            dd draw_window  ;+28
  798. .status                 dd 0    ;+32
  799. .openfile_pach          dd file_name    ;+36
  800. .filename_area          dd filename_area        ;+40
  801. .filter_area            dd Filter
  802. .x:
  803. .x_size                 dw 420 ;+48 ; Window X size
  804. .x_start                dw 10 ;+50 ; Window X position
  805. .y:
  806. .y_size                 dw 320 ;+52 ; Window y size
  807. .y_start                dw 10 ;+54 ; Window Y position
  808.  
  809. communication_area_name:
  810.         db 'FFFFFFFF_open_dialog',0
  811. open_dialog_path:
  812.         db '/sys/File Managers/opendial',0
  813. communication_area_default_pach:
  814.         db '/sys',0
  815. Filter:
  816. dd      Filter.end - Filter.1
  817. .1:
  818. db      'TXT',0
  819. db      'LOG',0
  820. .end:
  821. dd      0
  822.  
  823. file_default_path:
  824.         db '/sys/'
  825. start_temp_file_name:  
  826.         db 'pcidev.txt',0
  827. ;---------------------------------------------------------------------
  828. align   4
  829. fileinfo:
  830. .subfunction    dd 2
  831. .Offset         dd 0
  832. .Offset_1       dd 0
  833. .size           dd 4096
  834. .return         dd 0
  835.                 db 0
  836. .name:          dd file_name
  837. ;-----------------------------------------------------------------------------
  838.  
  839. ; UNINITIALIZED DATA AREA
  840. IM_END:
  841. total           db ?
  842. V_Bus           db ?
  843. V_Dev           db ?
  844. PCI_Version     dw ?
  845. PCI_LastBus     db ?
  846. PCI_Device      dw ?
  847. PCI_Vendor      dw ?
  848. PCI_Bus         db ?
  849. PCI_Dev         db ?
  850. PCI_Rev         db ?
  851. ; don`t change order!!!
  852. PCI_Class       db ?
  853. PCI_SubClass    db ?
  854. PCI_Interface   db ?
  855. PCI_IRQ         db ?
  856.  
  857. align 4
  858. MMIO_Bus        db 255
  859. MMIO_Dev        db 255
  860. MMIO_BAR        db 0
  861. MMIO_allowed    db 1
  862. MMIO_Map        rd 8
  863.  
  864. gr_pos          dd ?
  865.  
  866. store_text_area_start   dd ?
  867. store_text_area_end     dd ?
  868. store_text_size         dd ?
  869.  
  870. extended_key    rb 1
  871. ;---------------------------------------------------------------------
  872. library_path:
  873.         rb 4096
  874. ;---------------------------------------------------------------------
  875. path:
  876.         rb 4096
  877. ;---------------------------------------------------------------------
  878. temp_dir_pach:
  879.         rb 4096
  880. ;---------------------------------------------------------------------
  881. file_name:
  882.         rb 4096
  883. ;---------------------------------------------------------------------
  884. file_name_1:
  885.         rb 4096
  886. ;---------------------------------------------------------------------
  887. filename_area:
  888.         rb 256
  889. ;---------------------------------------------------------------------
  890.         rb 4096
  891. stacktop:
  892. ;---------------------------------------------------------------------
  893. Proc_Info       process_information
  894. ;---------------------------------------------------------------------
  895. I_END:
  896. ;-----------------------------------------------------------------------------
  897.