Subversion Repositories Kolibri OS

Rev

Rev 1357 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1357 Rev 1358
1
;***************************************************************
1
;***************************************************************
2
; project name:    PCI Device Enumeration
2
; project name:    PCI Device Enumeration
3
; target platform: KolibriOS
3
; target platform: KolibriOS
4
; compiler:        flat assembler 1.68
4
; compiler:        flat assembler 1.68
5
; version:         2.2
5
; version:         2.2
6
; last update:     December 2007
6
; last update:     December 2007
7
; maintained by:   Jason Delozier (cordata51@hotmail.com)
7
; maintained by:   Jason Delozier (cordata51@hotmail.com)
8
;                  Sergey Kuzmin (kuzmin_serg@list.ru)
8
;                  Sergey Kuzmin (kuzmin_serg@list.ru)
9
;                  Mihailov Ilia (ghost.nsk@gmail.com)
9
;                  Mihailov Ilia (ghost.nsk@gmail.com)
10
;                  Artem Jerdev  (art_zh@yahoo.com)
10
;                  Artem Jerdev  (art_zh@yahoo.com)
11
; project site:    http://www.coolthemes.narod.ru/pcidev.html
11
; project site:    http://www.coolthemes.narod.ru/pcidev.html
12
;***************************************************************
12
;***************************************************************
13
;Summary: This program will attempt to scan the PCI Bus
13
;Summary: This program will attempt to scan the PCI Bus
14
;        and display basic information about each device
14
;        and display basic information about each device
15
;        connected to the PCI Bus.
15
;        connected to the PCI Bus.
16
;***************************************************************
16
;***************************************************************
17
;HISTORY:
17
;HISTORY:
18
;keep dates in european format (dd/mm/yyyy), please
18
;keep dates in european format (dd/mm/yyyy), please
19
; '!' means big changes
19
; '!' means big changes
20
;
20
;
21
;to-do:
21
;to-do:
22
; more vendors
22
; more vendors
23
; vendor's website
23
; vendor's website
24
; Subsystem id and Subsystem vendor id detection
24
; Subsystem id and Subsystem vendor id detection
25
 
25
 
26
; Full device detection (like "ATI Radeon 9200") will increase app
26
; Full device detection (like "ATI Radeon 9200") will increase app
27
; size a lot and probably it is function of particular drivers
27
; size a lot and probably it is function of particular drivers
28
;----------------------------------------------------------------
28
;----------------------------------------------------------------
29
;2.2: PCIDEV   31/12/2009
29
;2.2: PCIDEV   31/12/2009
30
;Author:    Artem Jerdev 
30
;Author:    Artem Jerdev 
31
;Features:
31
;Features:
32
;           fixed
32
;           fixed
33
;                 * English in some comments ;)
33
;                 * English in some comments ;)
34
;           added
34
;           added
35
;                 * ! user-accessible PCI memory channels detection
35
;                 * ! user-accessible PCI memory channels detection
36
;                 * ! ASCII-dump as PCI memory access demonstration
36
;                 * ! ASCII-dump as PCI memory access demonstration
37
;           optimization
37
;           optimization
38
;                 * (yet needed)
38
;                 * (yet needed)
39
;----------------------------------------------------------------
39
;----------------------------------------------------------------
40
;2.1: PCIDEV   ??/04/2007
40
;2.1: PCIDEV   ??/04/2007
41
;Author:    Mihailov Ilia aka Ghost 
41
;Author:    Mihailov Ilia aka Ghost 
42
;Features:
42
;Features:
43
;           fixed
43
;           fixed
44
;                 * Some little bugs
44
;                 * Some little bugs
45
;                 * Source code formating
45
;                 * Source code formating
46
;                 * PCI version normalized 0210 -> 2.10
46
;                 * PCI version normalized 0210 -> 2.10
47
;           added
47
;           added
48
;                 * + 13 vendor (total now 1000!)
48
;                 * + 13 vendor (total now 1000!)
49
;                 * + 3 class type
49
;                 * + 3 class type
50
;                 * Fast call source ready
50
;                 * Fast call source ready
51
;                 * Device IRQ detection
51
;                 * Device IRQ detection
52
;           optimized
52
;           optimized
53
;                 * ! size optimized (61025 -> 32501 see added)
53
;                 * ! size optimized (61025 -> 32501 see added)
54
;                 * easy to add new vendor & class names
54
;                 * easy to add new vendor & class names
55
;----------------------------------------------------------------
55
;----------------------------------------------------------------
56
;2.0: PCIDEV   30/08/2006
56
;2.0: PCIDEV   30/08/2006
57
;(it differs a lot from the version 1.0, which was introduced 19 months ago)
57
;(it differs a lot from the version 1.0, which was introduced 19 months ago)
58
;Author:    Marat Zakiyanov aka Mario79 
58
;Author:    Marat Zakiyanov aka Mario79 
59
;           Sergey Kuzmin aka Wildwest 
59
;           Sergey Kuzmin aka Wildwest 
60
;Features:
60
;Features:
61
;           added
61
;           added
62
;                 * Detection of Interface by Mario79
62
;                 * Detection of Interface by Mario79
63
;                 * 122 vendor id's by Wildwest
63
;                 * 122 vendor id's by Wildwest
64
;                 * Description is based on Class, SubClass and Interface now (PCI 3.0) by Wildwest
64
;                 * Description is based on Class, SubClass and Interface now (PCI 3.0) by Wildwest
65
;----------------------------------------------------------------
65
;----------------------------------------------------------------
66
;1.31: PCIDEV   13/05/2006
66
;1.31: PCIDEV   13/05/2006
67
;Author:    Jason Delozier 
67
;Author:    Jason Delozier 
68
;Features:
68
;Features:
69
;           fixed
69
;           fixed
70
;                 * ! bug in Company Name look up code that would cause Unknown Name errors.
70
;                 * ! bug in Company Name look up code that would cause Unknown Name errors.
71
;                 * ! possible bugs, many instructions missing byte, word, dword prefixes
71
;                 * ! possible bugs, many instructions missing byte, word, dword prefixes
72
;                 * ! possible bug which could have occured after removing  "PREVIOUSVERSIONLIST"
72
;                 * ! possible bug which could have occured after removing  "PREVIOUSVERSIONLIST"
73
;                     entry in loop up code and not fixing jump parameters.
73
;                     entry in loop up code and not fixing jump parameters.
74
;           added
74
;           added
75
;                 *  comments to various parts of the code
75
;                 *  comments to various parts of the code
76
;           optimized
76
;           optimized
77
;                 * various parts of the source, too many to remember and mention.
77
;                 * various parts of the source, too many to remember and mention.
78
;                 * changed entries for Subclasses in vendors.inc to Byte format, saves a little space.
78
;                 * changed entries for Subclasses in vendors.inc to Byte format, saves a little space.
79
;----------------------------------------------------------------
79
;----------------------------------------------------------------
80
;1.30: PCIDEV   11/05/2006
80
;1.30: PCIDEV   11/05/2006
81
;Author:    Sergey Kuzmin aka Wildwest 
81
;Author:    Sergey Kuzmin aka Wildwest 
82
;Features:
82
;Features:
83
;           added
83
;           added
84
;                * 3 new vendor id's (ESS from Madis Kalme and 2 id's
84
;                * 3 new vendor id's (ESS from Madis Kalme and 2 id's
85
;                  forgotten from 1.15 release: Broadcom -SiByte and Chaintech Comp.)
85
;                  forgotten from 1.15 release: Broadcom -SiByte and Chaintech Comp.)
86
;           changed
86
;           changed
87
;                * I don't know why other devs (Jason or Victor) changed window style
87
;                * I don't know why other devs (Jason or Victor) changed window style
88
;                  to old ugly one, so I changed it back to skinned type 3.
88
;                  to old ugly one, so I changed it back to skinned type 3.
89
;                * the same goes to the use of macroc.inc - it is enabled again.
89
;                * the same goes to the use of macroc.inc - it is enabled again.
90
;           deleted
90
;           deleted
91
;                * there is no more label "PREVIOUSVERSIONLIST" - id's moved to the
91
;                * there is no more label "PREVIOUSVERSIONLIST" - id's moved to the
92
;                  appropriate parts of global list.
92
;                  appropriate parts of global list.
93
;----------------------------------------------------------------
93
;----------------------------------------------------------------
94
;1.29: PCIDEV   30/04/2006
94
;1.29: PCIDEV   30/04/2006
95
;Author:    Jason Delozier 
95
;Author:    Jason Delozier 
96
;Features:
96
;Features:
97
;           fixed
97
;           fixed
98
;                 * ! bug that would not allow devices with device
98
;                 * ! bug that would not allow devices with device
99
;                   numbers > 16 to be displayed.
99
;                   numbers > 16 to be displayed.
100
;           added
100
;           added
101
;                 * ! another heading called "FNC" (function) which allows
101
;                 * ! another heading called "FNC" (function) which allows
102
;                   the multipurpose Device/Function varible to be split and
102
;                   the multipurpose Device/Function varible to be split and
103
;                   displayed to the user properly.
103
;                   displayed to the user properly.
104
;                 * horizontal bars to display for easier reading.
104
;                 * horizontal bars to display for easier reading.
105
;           optimized
105
;           optimized
106
;                 * vendor/description search routines for speed and space.
106
;                 * vendor/description search routines for speed and space.
107
;----------------------------------------------------------------
107
;----------------------------------------------------------------
108
;1.25: PCIDEV   02/10/2005
108
;1.25: PCIDEV   02/10/2005
109
;Author:    Sergey Kuzmin aka Wildwest 
109
;Author:    Sergey Kuzmin aka Wildwest 
110
;Features:
110
;Features:
111
;            changed
111
;            changed
112
;                  * ! Description is based on Class and SubClass
112
;                  * ! Description is based on Class and SubClass
113
;                     now (PCI 3.0). The Names of Classes and SubClasses
113
;                     now (PCI 3.0). The Names of Classes and SubClasses
114
;                     are in the end of Vendors.inc
114
;                     are in the end of Vendors.inc
115
;            deleted
115
;            deleted
116
;                  * label "Descriptions" (names of Classes)
116
;                  * label "Descriptions" (names of Classes)
117
;
117
;
118
;----------------------------------------------------------------
118
;----------------------------------------------------------------
119
;1.20: PCIDEV   16/08/2005
119
;1.20: PCIDEV   16/08/2005
120
;Author:    Victor Alberto Gil Hanla a.k.a. vhanla 
120
;Author:    Victor Alberto Gil Hanla a.k.a. vhanla 
121
;Features:
121
;Features:
122
;           added
122
;           added
123
;                  * ! many vendor lists (865)
123
;                  * ! many vendor lists (865)
124
;           deleted
124
;           deleted
125
;                  * previous version's list
125
;                  * previous version's list
126
;           changed
126
;           changed
127
;                  * previous Company Name searching and printing
127
;                  * previous Company Name searching and printing
128
;----------------------------------------------------------------
128
;----------------------------------------------------------------
129
;1.15: PCIDEV   03/06/2005
129
;1.15: PCIDEV   03/06/2005
130
;Author:    Sergey Kuzmin aka Wildwest 
130
;Author:    Sergey Kuzmin aka Wildwest 
131
;Features:
131
;Features:
132
;           added
132
;           added
133
;                 * quantity of devices,
133
;                 * quantity of devices,
134
;                 * ! detection of Company Name based on Vendor ID,
134
;                 * ! detection of Company Name based on Vendor ID,
135
;                 * database of VenID (35 ID's),
135
;                 * database of VenID (35 ID's),
136
;                 * macros.inc for smaller size,
136
;                 * macros.inc for smaller size,
137
;           changed
137
;           changed
138
;                 * interface+(skinned window),
138
;                 * interface+(skinned window),
139
;                 * VenID before DevID in 'table'(was DevID before VenID)
139
;                 * VenID before DevID in 'table'(was DevID before VenID)
140
;----------------------------------------------------------------
140
;----------------------------------------------------------------
141
;1.0: PCIDEV    30/01/2005
141
;1.0: PCIDEV    30/01/2005
142
;Author:    Jason Delozier
142
;Author:    Jason Delozier
143
;Features:
143
;Features:
144
;          able to
144
;          able to
145
;                 * detect PCI version,
145
;                 * detect PCI version,
146
;                 * quantity of PCI buses,
146
;                 * quantity of PCI buses,
147
;                 * Vendor&Device ID for appropriate Device on Bus;
147
;                 * Vendor&Device ID for appropriate Device on Bus;
148
;                 * detect Revision, Class and Subclass of Device,
148
;                 * detect Revision, Class and Subclass of Device,
149
;                 * and make Description based on Class
149
;                 * and make Description based on Class
150
;-------------------------------------------------------------
150
;-------------------------------------------------------------
151
;include '..\..\macros.inc'
151
;include '..\..\macros.inc'
152
include 'macros.inc'
152
include 'macros.inc'
153
 
153
 
154
MEOS_APP_START
154
MEOS_APP_START
155
CODE
155
CODE
156
	call draw_window
156
	call draw_window
157
 
157
 
158
still:	mcall	10			; wait here for event
158
still:	mcall	10			; wait here for event
159
	dec	eax			; redraw request ?
159
	dec	eax			; redraw request ?
160
	jz	red
160
	jz	red
161
	dec	eax			; key in buffer ?
161
	dec	eax			; key in buffer ?
162
	jz	key
162
	jz	key
163
	dec	eax			; button in buffer ?
163
	dec	eax			; button in buffer ?
164
	jz	button
164
	jz	button
165
	jmp	still
165
	jmp	still
166
 
166
 
167
red:					; redraw
167
red:					; redraw
168
	mcall	9, Proc_Info, -1	; window redraw requested so get new window coordinates and size
168
	mcall	9, Proc_Info, -1	; window redraw requested so get new window coordinates and size
169
	mov	eax, [Proc_Info.box.left]; store the window coordinates into the Form Structure
169
	mov	eax, [Proc_Info.box.left]; store the window coordinates into the Form Structure
170
	mov	[Form + 2], ax		; x start position
170
	mov	[Form + 2], ax		; x start position
171
	mov	eax, [Proc_Info.box.top];
171
	mov	eax, [Proc_Info.box.top];
172
	mov	[Form + 6], ax		; ystart position
172
	mov	[Form + 6], ax		; ystart position
173
	mov	eax, [Proc_Info.box.width]	;
173
	mov	eax, [Proc_Info.box.width]	;
174
	mov	[Form], ax		; window width
174
	mov	[Form], ax		; window width
175
	mov	eax, [Proc_Info.box.height]	;
175
	mov	eax, [Proc_Info.box.height]	;
176
	mov	[Form + 4] ,ax		; window height
176
	mov	[Form + 4] ,ax		; window height
177
	call	draw_window		; go redraw window now
177
	call	draw_window		; go redraw window now
178
	jmp	still
178
	jmp	still
179
 
179
 
180
key:					; key
180
key:					; key
181
	mcall	2			; just read it and ignore
181
	mcall	2			; just read it and ignore
182
	jmp	still
182
	jmp	still
183
button: 				; button
183
button: 				; button
184
	mcall	17			; get id
184
	mcall	17			; get id
185
	cmp	ah, 1			; button id = 1 ?
185
	cmp	ah, 1			; button id = 1 ?
186
	jne	still
186
	jne	still
187
	mcall	-1			; close this program
187
	mcall	-1			; close this program
188
 
188
 
189
draw_window:
189
draw_window:
190
	mov	byte [total], 0
190
	mov	byte [total], 0
191
	mcall	12, 1			; start of draw
191
	mcall	12, 1			; start of draw
192
	; DRAW WINDOW
192
	; DRAW WINDOW
193
	mcall	0, dword [Form], dword [Form + 4], 0x13ffffff, 0x805080d0, title
193
	mcall	0, dword [Form], dword [Form + 4], 0x13ffffff, 0x805080d0, title
194
	; Insert horizontal bars  in list area
194
	; Insert horizontal bars  in list area
195
	mov	eax, 13 		; draw bar system function
195
	mov	eax, 13 		; draw bar system function
196
	mov	ebx, 18 		; set Xstart position of bar
196
	mov	ebx, 18 		; set Xstart position of bar
197
	shl	ebx, 16 		;
197
	shl	ebx, 16 		;
198
	mov	bx, word [Form] ; get width of window
198
	mov	bx, word [Form] ; get width of window
199
	sub	bx, 32			; bar is 32 pixels shorter then window width
199
	sub	bx, 32			; bar is 32 pixels shorter then window width
200
	mov	ecx, 119 * 65536 + 10	; set Ystart(109) and Height(10) of bar   109
200
	mov	ecx, 119 * 65536 + 10	; set Ystart(109) and Height(10) of bar   109
201
	mov	edx, 0xC0C0C0		; set color of bar
201
	mov	edx, 0xC0C0C0		; set color of bar
202
again:	;begin draw bar loop
202
again:	;begin draw bar loop
203
	mcall				; draw bar to window area
203
	mcall				; draw bar to window area
204
	shr	ecx, 16 		; move the Ystart position to working area
204
	shr	ecx, 16 		; move the Ystart position to working area
205
	add	ecx, 34 		; add 34 pixels to Y Start (moves bar down)
205
	add	ecx, 34 		; add 34 pixels to Y Start (moves bar down)
206
	cmp	cx, word [Form + 4]	; is the Ystart position outside of window area
206
	cmp	cx, word [Form + 4]	; is the Ystart position outside of window area
207
	jae	nomo			; if so stop drawing bars
207
	jae	nomo			; if so stop drawing bars
208
	sub	ecx, 14 		; if not, we only need 20 pixels between bar tops
208
	sub	ecx, 14 		; if not, we only need 20 pixels between bar tops
209
	shl	ecx, 16 		; set that values as Ystart
209
	shl	ecx, 16 		; set that values as Ystart
210
	add	ecx, 10 		; Bar Height is always 10 pixels
210
	add	ecx, 10 		; Bar Height is always 10 pixels
211
	jmp	again			; draw another bar
211
	jmp	again			; draw another bar
212
nomo:					;done drawing bars here
212
nomo:					;done drawing bars here
213
	; start PCI stuff
213
	; start PCI stuff
214
	call	Get_PCI_Info		; get pci version and last bus, scan for and draw each pci device
214
	call	Get_PCI_Info		; get pci version and last bus, scan for and draw each pci device
215
 
215
 
216
	; Window inteface
216
	; Window inteface
217
	mov	cx, [PCI_Version]
217
	mov	cx, [PCI_Version]
218
	add	ch, '0'
218
	add	ch, '0'
219
	mov	[PCIWin + 85], ch	; 0xBADCODE but it works !
219
	mov	[PCIWin + 85], ch	; 0xBADCODE but it works !
220
	mov	ch, cl
220
	mov	ch, cl
221
	shr	cl, 4
221
	shr	cl, 4
222
	and	ch, 0x0f
222
	and	ch, 0x0f
223
	add	cx, '00'
223
	add	cx, '00'
224
	mov	[PCIWin + 87], cx
224
	mov	[PCIWin + 87], cx
225
	mov	cl, [PCI_LastBus]	; will only work if [PCI_LastBus] < 10
225
	mov	cl, [PCI_LastBus]	; will only work if [PCI_LastBus] < 10
226
	add	cl, '0'
226
	add	cl, '0'
227
	mov	[PCIWin + 106], cl
227
	mov	[PCIWin + 106], cl
228
 
228
 
229
	mov	edx, PCIWin
229
	mov	edx, PCIWin
230
	mov	ebx, 20 * 65536 + 25	; x start, ystart of text
230
	mov	ebx, 20 * 65536 + 25	; x start, ystart of text
231
	mov	ecx, 0x224466		; color of text
231
	mov	ecx, 0x224466		; color of text
232
	mov	eax, 4
232
	mov	eax, 4
233
@@:	movzx	esi, byte[edx]
233
@@:	movzx	esi, byte[edx]
234
	inc	edx
234
	inc	edx
235
	mcall
235
	mcall
236
	add	ebx, 10
236
	add	ebx, 10
237
	add	edx, esi
237
	add	edx, esi
238
	cmp	byte[edx], -1
238
	cmp	byte[edx], -1
239
	jne	@b
239
	jne	@b
240
	; Quantity of devices...
240
	; Quantity of devices...
241
	movzx	ecx, byte [total]	; number to draw
241
	movzx	ecx, byte [total]	; number to draw
242
	mcall	47, 0x00020000,,150 * 65536 + 65, 0x224466
242
	mcall	47, 0x00020000,,150 * 65536 + 65, 0x224466
243
 
243
 
244
	call	Try_MMIO
244
	call	Try_MMIO
245
	mcall	12, 2			; end of draw
245
	mcall	12, 2			; end of draw
246
	ret
246
	ret
247
 
247
 
248
;------------------------------------------------------------------
248
;------------------------------------------------------------------
249
;* Gets the PCI Version and Last Bus
249
;* Gets the PCI Version and Last Bus
250
Get_PCI_Info:
250
Get_PCI_Info:
251
	mcall	62, 0
251
	mcall	62, 0
252
	mov	word [PCI_Version], ax
252
	mov	word [PCI_Version], ax
253
	mcall	62, 1
253
	mcall	62, 1
254
	mov	byte [PCI_LastBus], al
254
	mov	byte [PCI_LastBus], al
255
	;----------------------------------------------------------
255
	;----------------------------------------------------------
256
	;* Get all devices on PCI Bus
256
	;* Get all devices on PCI Bus
257
	cmp	al, 0xff		; 0xFF means no pci bus found
257
	cmp	al, 0xff		; 0xFF means no pci bus found
258
	jne	Pci_Exists		;
258
	jne	Pci_Exists		;
259
	ret				; if no bus then leave
259
	ret				; if no bus then leave
260
Pci_Exists:
260
Pci_Exists:
261
	mov	byte [V_Bus], 0 	; reset varibles
261
	mov	byte [V_Bus], 0 	; reset varibles
262
	mov	byte [V_Dev], 0 	;
262
	mov	byte [V_Dev], 0 	;
263
	mov	edx,  20 * 65536 + 110	; set start write position
263
	mov	edx,  20 * 65536 + 110	; set start write position
264
Start_Enum:
264
Start_Enum:
265
	mov	bl, 6			; get a dword
265
	mov	bl, 6			; get a dword
266
	mov	bh, byte [V_Bus]	; bus of pci device
266
	mov	bh, byte [V_Bus]	; bus of pci device
267
	mov	ch, byte [V_Dev]	; device number/function
267
	mov	ch, byte [V_Dev]	; device number/function
268
	mov	cl, 0			; offset to device/vendor id
268
	mov	cl, 0			; offset to device/vendor id
269
	mcall	62			; get ID's
269
	mcall	62			; get ID's
270
 
270
 
271
	cmp	ax, 0			; Vendor ID should not be 0 or 0xFFFF
271
	cmp	ax, 0			; Vendor ID should not be 0 or 0xFFFF
272
	je	nextDev 		; check next device if nothing exists here
272
	je	nextDev 		; check next device if nothing exists here
273
	cmp	ax, 0xffff		;
273
	cmp	ax, 0xffff		;
274
	je	nextDev 		;
274
	je	nextDev 		;
275
 
275
 
276
	mov	word [PCI_Vendor], ax	; There is a device here, save the ID's
276
	mov	word [PCI_Vendor], ax	; There is a device here, save the ID's
277
	shr	eax, 16 		;
277
	shr	eax, 16 		;
278
	mov	word [PCI_Device], ax	;
278
	mov	word [PCI_Device], ax	;
279
	mov	bl, 4			; Read config byte
279
	mov	bl, 4			; Read config byte
280
	mov	bh, byte [V_Bus]	; Bus #
280
	mov	bh, byte [V_Bus]	; Bus #
281
	mov	ch, byte [V_Dev]	; Device # on bus
281
	mov	ch, byte [V_Dev]	; Device # on bus
282
	mov	cl, 0x08		; Register to read (Get Revision)
282
	mov	cl, 0x08		; Register to read (Get Revision)
283
	mcall	62			; Read it
283
	mcall	62			; Read it
284
	mov	byte [PCI_Rev], al	; Save it
284
	mov	byte [PCI_Rev], al	; Save it
285
	mov	cl, 0x0b		; Register to read (Get class)
285
	mov	cl, 0x0b		; Register to read (Get class)
286
	mcall	62			; Read it
286
	mcall	62			; Read it
287
 
287
 
288
	mov	byte [PCI_Class], al	; Save it
288
	mov	byte [PCI_Class], al	; Save it
289
	mov	cl, 0x0a		; Register to read (Get Subclass)
289
	mov	cl, 0x0a		; Register to read (Get Subclass)
290
	mcall	62			; Read it
290
	mcall	62			; Read it
291
	mov	byte [PCI_SubClass], al; Save it
291
	mov	byte [PCI_SubClass], al; Save it
292
; by Mario79 august 2006
292
; by Mario79 august 2006
293
	mov	cl, 0x09		; Register to read (Get Interface)
293
	mov	cl, 0x09		; Register to read (Get Interface)
294
	mcall	62			; Read it
294
	mcall	62			; Read it
295
	mov  [PCI_Interface], al	; Save it
295
	mov  [PCI_Interface], al	; Save it
296
;
296
;
297
; by Ghost april 2007
297
; by Ghost april 2007
298
	mov	cl, 0x3c		; Register to read (Get IRQ)
298
	mov	cl, 0x3c		; Register to read (Get IRQ)
299
@@:	mcall	62			; Read it
299
@@:	mcall	62			; Read it
300
	mov	[PCI_IRQ], al		; Save it
300
	mov	[PCI_IRQ], al		; Save it
301
;
301
;
302
	inc	byte [total]		; one more device found
302
	inc	byte [total]		; one more device found
303
	call	Print_New_Device	; print device info to screen
303
	call	Print_New_Device	; print device info to screen
304
nextDev:
304
nextDev:
305
	inc	byte [V_Dev]		; next device on this bus
305
	inc	byte [V_Dev]		; next device on this bus
306
	jnz	Start_Enum		; jump until we reach zero
306
	jnz	Start_Enum		; jump until we reach zero
307
	;(used to be JNO which caused bug!!! 30-4-2006, JMD)
307
	;(used to be JNO which caused bug!!! 30-4-2006, JMD)
308
	mov	byte [V_Dev], 0 	; reset device number
308
	mov	byte [V_Dev], 0 	; reset device number
309
	inc	byte [V_Bus]		; next bus
309
	inc	byte [V_Bus]		; next bus
310
	mov	al, byte [PCI_LastBus]	; get last bus
310
	mov	al, byte [PCI_LastBus]	; get last bus
311
	cmp	byte [V_Bus], al	; was it last bus
311
	cmp	byte [V_Bus], al	; was it last bus
312
	jbe	Start_Enum		; if not jump to keep searching
312
	jbe	Start_Enum		; if not jump to keep searching
313
	ret
313
	ret
314
 
314
 
315
;------------------------------------------------------------------
315
;------------------------------------------------------------------
316
;* Print device info to screen
316
;* Print device info to screen
317
Print_New_Device:
317
Print_New_Device:
318
	xor esi, esi	    ; default text color
318
	xor esi, esi	    ; default text color
319
; by art_zh December 2009
319
; by art_zh December 2009
320
	mov ch, byte [V_Bus]
320
	mov ch, byte [V_Bus]
321
	mov cl, byte [V_Dev]
321
	mov cl, byte [V_Dev]
322
	mcall	62, 11		; detect uMMIO
322
	mcall	62, 11		; detect uMMIO
323
	cmp eax, -2
323
	cmp eax, -2
324
	je no_ummio_here
324
	je no_ummio_here
325
	mov esi, 0x990033   ; highlighted text color
325
	mov esi, 0x990033   ; highlighted text color
326
	mov bh, byte [V_Bus]
326
	mov bh, byte [V_Bus]
327
	mov bl, byte [V_Dev]
327
	mov bl, byte [V_Dev]
328
	mov byte [MMIO_Bus], bh
328
	mov byte [MMIO_Bus], bh
329
	mov byte [MMIO_Dev], bl
329
	mov byte [MMIO_Dev], bl
330
	add bh,'0'
330
	add bh,'0'
331
	mov [PCIWin + 129], bh	; uMMIO bus
331
	mov [PCIWin + 129], bh	; uMMIO bus
332
	mov al, bl
332
	mov al, bl
333
	shr al, 1
333
	shr al, 1
334
	shr al, 1
334
	shr al, 1
335
	shr al, 1
335
	shr al, 1
336
	add al,'0'
336
	add al,'0'
337
	mov [PCIWin + 131], al	; uMMIO device
337
	mov [PCIWin + 131], al	; uMMIO device
338
	and bl, 7
338
	and bl, 7
339
	add bl, '0'
339
	add bl, '0'
340
	mov [PCIWin + 133], bl	; uMMIO function
340
	mov [PCIWin + 133], bl	; uMMIO function
341
 
341
 
342
no_ummio_here:
342
no_ummio_here:
343
	movzx	ecx,word [PCI_Vendor]	; Pointer to number to be written
343
	movzx	ecx,word [PCI_Vendor]	; Pointer to number to be written
344
	mcall	47, 0x00040100		; Write Vendor ID
344
	mcall	47, 0x00040100		; Write Vendor ID
345
	and	edx, 0xFFFF		;*****************************************
345
	and	edx, 0xFFFF		;*****************************************
346
	or	edx, 54 * 65536 ; X start becomes 54
346
	or	edx, 54 * 65536 ; X start becomes 54
347
	movzx	ecx, word [PCI_Device]	; get Vendor ID
347
	movzx	ecx, word [PCI_Device]	; get Vendor ID
348
	mcall				; Draw Vendor ID to Window
348
	mcall				; Draw Vendor ID to Window
349
	and	edx, 0xFFFF		;*****************************************
349
	and	edx, 0xFFFF		;*****************************************
350
	or	edx, 98 * 65536 ; X start becomes 98
350
	or	edx, 98 * 65536 ; X start becomes 98
351
	movzx	ecx, byte [V_Bus]	; get bus number
351
	movzx	ecx, byte [V_Bus]	; get bus number
352
	mcall	,0x00020100		; draw bus number to screen
352
	mcall	,0x00020100		; draw bus number to screen
353
	and	edx, 0xFFFF		;*****************************************
353
	and	edx, 0xFFFF		;*****************************************
354
	or	edx, 128 * 65536	; X start becomes 128
354
	or	edx, 128 * 65536	; X start becomes 128
355
	movzx	ecx, byte [V_Dev]	; get device number
355
	movzx	ecx, byte [V_Dev]	; get device number
356
	shr	ecx, 3			; device number is bits 3-7
356
	shr	ecx, 3			; device number is bits 3-7
357
	mcall				; Draw device Number To Window
357
	mcall				; Draw device Number To Window
358
 
358
 
359
	and	edx, 0xFFFF		;*****************************************
359
	and	edx, 0xFFFF		;*****************************************
360
	or	edx, 155 * 65536	; X start becomes 155
360
	or	edx, 155 * 65536	; X start becomes 155
361
	movzx	ecx, byte [V_Dev]	; get Function number
361
	movzx	ecx, byte [V_Dev]	; get Function number
362
	and	ecx, 7			; function is first 3 bits
362
	and	ecx, 7			; function is first 3 bits
363
	mcall				; Draw Function Number To Window
363
	mcall				; Draw Function Number To Window
364
	and	edx, 0xFFFF		;*****************************************
364
	and	edx, 0xFFFF		;*****************************************
365
	or	edx, 179 * 65536	; X start becomes 179
365
	or	edx, 179 * 65536	; X start becomes 179
366
	movzx	ecx, byte [PCI_Rev]	; get revision number
366
	movzx	ecx, byte [PCI_Rev]	; get revision number
367
	mcall				; Draw Revision to screen
367
	mcall				; Draw Revision to screen
368
	and	edx, 0xFFFF		;*****************************************
368
	and	edx, 0xFFFF		;*****************************************
369
	or	edx, 215*65536		; X start becomes 215
369
	or	edx, 215*65536		; X start becomes 215
370
	movzx	ecx, byte [PCI_Class]	; get PCI_Class
370
	movzx	ecx, byte [PCI_Class]	; get PCI_Class
371
	mcall				; Draw Class to screen
371
	mcall				; Draw Class to screen
372
	and	edx, 0xFFFF		;*****************************************
372
	and	edx, 0xFFFF		;*****************************************
373
	or	edx, 250*65536		; X start becomes 250
373
	or	edx, 250*65536		; X start becomes 250
374
	movzx	ecx, byte [PCI_SubClass]; get sub class
374
	movzx	ecx, byte [PCI_SubClass]; get sub class
375
	mcall				; Draw Sub Class to screen
375
	mcall				; Draw Sub Class to screen
376
; from Mario79 august 2006
376
; from Mario79 august 2006
377
	and	edx, 0xFFFF		;*****************************************
377
	and	edx, 0xFFFF		;*****************************************
378
	or	edx, 280 * 65536	; X start becomes 280
378
	or	edx, 280 * 65536	; X start becomes 280
379
	movzx	ecx, [PCI_Interface]	; get Interface
379
	movzx	ecx, [PCI_Interface]	; get Interface
380
	mcall
380
	mcall
381
;
381
;
382
; from Ghost april 2007                 ;*****************************************
382
; from Ghost april 2007                 ;*****************************************
383
	movzx	ecx, [PCI_IRQ]		; get Interface
383
	movzx	ecx, [PCI_IRQ]		; get Interface
384
	cmp	cl, 0x0f		; IRQ between 0..15
384
	cmp	cl, 0x0f		; IRQ between 0..15
385
	ja	@f
385
	ja	@f
386
	and	edx, 0xFFFF
386
	and	edx, 0xFFFF
387
	or	edx, 310 * 65536	; X start becomes 310
387
	or	edx, 310 * 65536	; X start becomes 310
388
	mcall
388
	mcall
389
@@:
389
@@:
390
;
390
;
391
	;Write Names
391
	;Write Names
392
	movzx	ebx, dx 	; Set y position
392
	movzx	ebx, dx 	; Set y position
393
	or	ebx, 340 * 65536	; set Xposition to 340
393
	or	ebx, 340 * 65536	; set Xposition to 340
394
 
394
 
395
;------------------------------------------------------------------
395
;------------------------------------------------------------------
396
; Prints the Vendor's Name based on Vendor ID
396
; Prints the Vendor's Name based on Vendor ID
397
;
397
;
398
; Modified on ??-04-2007 by Ghost for size
398
; Modified on ??-04-2007 by Ghost for size
399
;------------------------------------------------------------------
399
;------------------------------------------------------------------
400
	mov	edx, VendorsTab
400
	mov	edx, VendorsTab
401
	mov	cx, word[PCI_Vendor]
401
	mov	cx, word[PCI_Vendor]
402
 
402
 
403
.fn:	mov	ax, [edx]
403
.fn:	mov	ax, [edx]
404
	add	edx, 6
404
	add	edx, 6
405
	test	ax, ax
405
	test	ax, ax
406
	jz	.find
406
	jz	.find
407
	cmp	ax, cx
407
	cmp	ax, cx
408
	jne	.fn
408
	jne	.fn
409
.find:	mov	edx, [edx - 4]
409
.find:	mov	edx, [edx - 4]
410
	mcall	4,, 0x80000000		; lets print the vendor Name
410
	mcall	4,, 0x80000000		; lets print the vendor Name
411
 
411
 
412
;------------------------------------------------------------------
412
;------------------------------------------------------------------
413
; Get description based on Class/Subclass
413
; Get description based on Class/Subclass
414
;
414
;
415
; Modified on ??-04-2007 by Ghost for size
415
; Modified on ??-04-2007 by Ghost for size
416
;------------------------------------------------------------------
416
;------------------------------------------------------------------
417
	mov	eax, dword [PCI_Class]
417
	mov	eax, dword [PCI_Class]
418
	and	eax, 0xffffff
418
	and	eax, 0xffffff
419
	xor	edx, edx
419
	xor	edx, edx
420
	xor	esi, esi
420
	xor	esi, esi
421
.fnc:	inc	esi
421
.fnc:	inc	esi
422
	mov	ecx, [Classes + esi * 8 - 8]
422
	mov	ecx, [Classes + esi * 8 - 8]
423
	cmp	cx, 0xffff
423
	cmp	cx, 0xffff
424
	je	.endfc
424
	je	.endfc
425
	cmp	cx, ax
425
	cmp	cx, ax
426
	jne	.fnc
426
	jne	.fnc
427
	test	ecx, 0xff000000
427
	test	ecx, 0xff000000
428
	jz	@f
428
	jz	@f
429
	mov	edx, [Classes + esi * 8 - 4]
429
	mov	edx, [Classes + esi * 8 - 4]
430
	jmp	.fnc
430
	jmp	.fnc
431
@@:	cmp	eax, ecx
431
@@:	cmp	eax, ecx
432
	jne	.fnc
432
	jne	.fnc
433
	xor	edx, edx
433
	xor	edx, edx
434
.endfc: test	edx, edx
434
.endfc: test	edx, edx
435
	jnz	@f
435
	jnz	@f
436
	mov	edx, [Classes + esi * 8 - 4]
436
	mov	edx, [Classes + esi * 8 - 4]
437
@@:
437
@@:
438
	and	ebx, 0x0000FFFF 	; clear X position
438
	and	ebx, 0x0000FFFF 	; clear X position
439
	or	ebx, 0x24E0000		; set X position to 590 pixels
439
	or	ebx, 0x24E0000		; set X position to 590 pixels
440
	mcall	4,, 0x80000000,, 32	; draw the text
440
	mcall	4,, 0x80000000,, 32	; draw the text
441
	movzx	edx, bx 	; get y coordinate
441
	movzx	edx, bx 	; get y coordinate
442
	add	edx, 0x0014000A 	; add 10 to y coordinate and set x coordinate to 20
442
	add	edx, 0x0014000A 	; add 10 to y coordinate and set x coordinate to 20
443
	mov	[gr_pos], edx
443
	mov	[gr_pos], edx
444
	ret
444
	ret
445
;------------------------------------------------------------------
445
;------------------------------------------------------------------
446
; Get the user-MMIO related info
446
; Get the user-MMIO related info
447
;
447
;
448
; Added on ??-12-2009 by art_zh
448
; Added on ??-12-2009 by art_zh
449
;------------------------------------------------------------------
449
;------------------------------------------------------------------
450
Try_MMIO:
450
Try_MMIO:
451
	xor	ebx, ebx
451
	xor	ebx, ebx
452
	mov	edx, ebx
452
	mov	edx, ebx
453
	mov	bh, byte [MMIO_BAR]
453
	mov	bh, [MMIO_BAR]
454
	or	bx, 12			; function 12
454
	or	bx, 12			; function 12
455
	mov	ecx, 4096		; =1 page to map
455
	mov	ecx, 4096		; =1 page to map
456
	mcall	62
456
	mcall	62
-
 
457
	mov	[MMIO_Map], eax 	; store MMIO lin.addr.
457
	mov	ecx, 0x80990022 	; print color : red
458
	mov	ecx, 0x80990022 	; print color : red
458
	mov	bh, byte [MMIO_BAR]
-
 
459
	add	bh, '0'
459
	add	bh, '0'
460
	cmp	eax, -3
460
	cmp	eax, -3
461
	jne	@f
461
	jne	@f
462
	mov	[bar_um+3], bh
462
	mov	[bar_um+3], bh
463
	mov	ebx, [gr_pos]
463
	mov	ebx, [gr_pos]
464
	mov	edx, bar_um
464
	mov	edx, bar_um
465
	mcall	4
465
	mcall	4
466
	jmp	mmio_next_bar
466
	jmp	mmio_next_bar
467
@@:
467
@@:
468
	cmp	eax, -4
468
	cmp	eax, -4
469
	jne	@f
469
	jne	@f
470
	mov	[bar_io+3], bh
470
	mov	[bar_io+3], bh
471
	mov	ebx, [gr_pos]
471
	mov	ebx, [gr_pos]
472
	mov	edx, bar_io
472
	mov	edx, bar_io
473
	mcall	4
473
	mcall	4
474
	jmp	mmio_next_bar
474
	jmp	mmio_next_bar
475
@@:
475
@@:
476
                cmp         bh, '6'	; expansion ROM ?
476
	cmp	bh, '6' 	; expansion ROM ?
477
                je             @f
477
	je	@f
478
	mov	[bar_ram+3], bh
478
	mov	[bar_ram+3], bh
479
	mov	ebx, [gr_pos]
479
	mov	ebx, [gr_pos]
480
	mov	edx, bar_ram
480
	mov	edx, bar_ram
481
	mcall	4
481
	mcall	4
482
                jmp        mmio_dump
482
	jmp	mmio_dump
483
@@:
483
@@:
484
	mov	ebx, [gr_pos]
484
	mov	ebx, [gr_pos]
485
	mov	edx, bar_rom
485
	mov	edx, bar_rom
486
	mcall	4
486
	mcall	4
487
 
487
 
488
mmio_dump:
488
mmio_dump:
489
	mov	edx, eax
489
	mov	edx, [MMIO_Map]
490
	mov	esi, 64
490
	mov	esi, 64
491
	mov	ecx, 0x099		; dump color : blue
491
	mov	ecx, 0x099		; dump color : blue
492
	add	ebx, 10
492
	add	ebx, 10
493
	mov	[gr_pos], ebx
493
	mov	[gr_pos], ebx
494
	mcall	4
494
	mcall	4
495
	mov	ecx, eax		; release the tried page
495
	mov	ecx, [MMIO_Map] 	; release the tried page
496
	mcall	62,13
496
	mcall	62,13
497
 
497
 
498
mmio_next_bar:
498
mmio_next_bar:
499
	mov	bh, [MMIO_BAR]
499
	mov	bh, [MMIO_BAR]
500
	inc	bh
500
	inc	bh
501
	cmp	bh,7
501
	cmp	bh,7
502
	je	@f
502
	je	@f
503
	mov	[MMIO_BAR], bh
503
	mov	[MMIO_BAR], bh
504
	add	[gr_pos], 10
504
	add	[gr_pos], 10
505
	jmp	Try_MMIO
505
	jmp	Try_MMIO
506
 
506
 
507
@@:
507
@@:
508
	xor	bh,bh
508
	xor	bh,bh
509
	mov	[MMIO_BAR], bh
509
	mov	[MMIO_BAR], bh
510
	ret
510
	ret
511
 
511
 
512
 
512
 
513
include 'VENDORS.INC'
513
include 'VENDORS.INC'
514
;------------------------------------------------------------------
514
;------------------------------------------------------------------
515
; DATA AREA
515
; DATA AREA
516
DATA
516
DATA
517
 
517
 
518
 
518
 
519
Form:	dw 800 ; window width (no more, special for 800x600)
519
Form:	dw 800 ; window width (no more, special for 800x600)
520
	dw 100 ; window x start
520
	dw 100 ; window x start
521
	dw 420 ; window height
521
	dw 620 ; window height
522
	dw 100 ; window y start
522
	dw 20 ; window y start
523
 
523
 
524
title	db 'PCI Device Enumerator v 2.2 by J.Delozier, S.Kuzmin, V.Hanla, M.Zakiyanov, A.Jerdev', 0
524
title	db 'PCI Device Enumerator v 2.2 by J.Delozier, S.Kuzmin, V.Hanla, M.Zakiyanov, A.Jerdev', 0
525
 
525
 
526
PCIWin mls \
526
PCIWin mls \
527
	'   Don`t forget to enable PCI Access to Applications in Setup Menu.',\
527
	'   Don`t forget to enable PCI Access to Applications in Setup Menu.',\
528
	'',\
528
	'',\
529
	'PCI Version  = x.xx; Last PCI Bus = x',\
529
	'PCI Version  = x.xx; Last PCI Bus = x',\
530
	'User MMIO channel = 0F.F:F ',\
530
	'User MMIO channel = 0F.F:F ',\
531
	'Number of PCI units =',\
531
	'Number of PCI units =',\
532
	'',\
532
	'',\
533
	'VenID DevID Bus# Dev# Fnc Rev  Class  Subclass/ IRQ                 Company                      Description',\
533
	'VenID DevID Bus# Dev# Fnc Rev  Class  Subclass/ IRQ                 Company                      Description',\
534
	'                                      Interface',\
534
	'                                      Interface',\
535
	'----- ----- ---- ---- --- ---  -----  --------- --- ------------------------------------------ ----------------'
535
	'----- ----- ---- ---- --- ---  -----  --------- --- ------------------------------------------ ----------------'
536
 
536
 
537
bar_ram db 'BARx: MMIO block', 0
537
bar_ram db 'BARx: MMIO block', 0
538
bar_io	db 'BARx: IO ports',0
538
bar_io	db 'BARx: IO ports',0
539
bar_um	db 'BARx: unmapped',0
539
bar_um	db 'BARx: unmapped',0
540
bar_rom db 'BAR6: Expansion ROM', 0  
540
bar_rom db 'BAR6: Expansion ROM', 0
541
 
541
 
542
;------------------------------------------------------------------
542
;------------------------------------------------------------------
543
; UNINITIALIZED DATA AREA
543
; UNINITIALIZED DATA AREA
544
UDATA
544
UDATA
545
 
545
 
546
total		db ?
546
total		db ?
547
V_Bus		db ?
547
V_Bus		db ?
548
V_Dev		db ?
548
V_Dev		db ?
549
PCI_Version	dw ?
549
PCI_Version	dw ?
550
PCI_LastBus	db ?
550
PCI_LastBus	db ?
551
PCI_Device	dw ?
551
PCI_Device	dw ?
552
PCI_Vendor	dw ?
552
PCI_Vendor	dw ?
553
PCI_Bus 	db ?
553
PCI_Bus 	db ?
554
PCI_Dev 	db ?
554
PCI_Dev 	db ?
555
PCI_Rev 	db ?
555
PCI_Rev 	db ?
556
; don`t change order!!!
556
; don`t change order!!!
557
PCI_Class	db ?
557
PCI_Class	db ?
558
PCI_SubClass	db ?
558
PCI_SubClass	db ?
559
PCI_Interface	db ?
559
PCI_Interface	db ?
560
PCI_IRQ 	db ?
560
PCI_IRQ 	db ?
561
 
561
 
562
align 4
562
align 4
563
MMIO_Bus	db ?
563
MMIO_Bus	db ?
564
MMIO_Dev	db ?
564
MMIO_Dev	db ?
565
MMIO_BAR	db 0
565
MMIO_BAR	db 0
566
MMIO_Blk	db 0
566
MMIO_Blk	db 0
567
MMIO_Map	rd 8
567
MMIO_Map	rd 8
568
 
568
 
569
gr_pos		dd ?
569
gr_pos		dd ?
570
 
570
 
571
Proc_Info	process_information
571
Proc_Info	process_information
572
MEOS_APP_END
572
MEOS_APP_END