home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: SysTools / SysTools.zip / pci040vk.zip / pci.doc < prev    next >
Text File  |  2000-05-29  |  27KB  |  555 lines

  1.      PCI - The PCI System information & Exploration tool.
  2.  
  3.  
  4. The following is a somewhat rambling text, from which you should be able to
  5. extract everything you ever wanted to know about this program! Please excuse my
  6. poor documentation style; I really hate writing the docs :-)
  7.  
  8.  
  9.  
  10.  ■ General
  11.  
  12. This code is Written by Craig Hart in 1996-2000. It is released as freeware;
  13. please use and modify at will. No guarantees are made or implied. Commercial
  14. use is permitted.
  15.  
  16. I'd appreciate credit if you find this code useful. I'd also be interested to
  17. see any code you may develop or modifications you create to this code...
  18. suggestions & bug fixes are _always_ welcomed.
  19.  
  20. I can be reached by email: chart@hyperlink.net.au
  21.  
  22. See my home page for the latest version of all my software releases,
  23. programmers information, updates for PCIDEVS.TXT and much more:
  24.  
  25. http://members.hyperlink.net.au/~chart
  26.  
  27.  
  28.  
  29.  
  30.   ■ Why create this program, anyhow? What use is it? What does it do?
  31.  
  32. PCI basically produces a report of the PCI & AGP devices fitted to a PC,
  33. including the system chipset. A plethoria of information is reported on,
  34. including system resource useage (IRQs, DMAs, Memory ranges, etc),
  35. busmastering, caching & device latencies, general capabilities and features,
  36. subsystem info, and much more. A text-file PCIDEVS.TXT lists thousands of known
  37. vendors, devices and subsystems, which PCI will refer to and display the info
  38. from. PCI covers all PCI device derivitives, including PCI 64-bit & 66MHz
  39. options, AGP (all speeds), CompactPCI, CardBus and PCI-X.
  40.  
  41. PCIDEVS.TXT is a plain text file, so you can update it yourself, however it is
  42. updated regularly (virtually daily) by the author, and the latest revision is
  43. always available as a free download from the webpage (see general section).
  44.  
  45. This program was originally written purely for me to learn how to program the
  46. PCI BIOS found in newer PC's. Since then, this program has proven to be vastly
  47. more useful, especially in the hands of a technician, system builder, and also
  48. in the hands of those about to purchase or upgrade a PC.
  49.  
  50. To a technician or system builder, PCI can act as a system information and
  51. diagnostic tool. It lists the resources devices have been assigned (for
  52. example, IRQ's, Memory regions, etc) so it is handy for finding conflicts.
  53. Because PCI also identifies the devices fitted, it is handy in figuring out
  54. _exactly_ what drivers are required when setting up a system.
  55.  
  56. PC buyers don't need to open a PC to see exactly what they're getting: your
  57. vendor can't tell you fibs about the chipset, graphic-card, or whatever, and
  58. since the PC doesn't need to be opened to check what you ordered is what you
  59. got fitted, you aren't loosing any warranties.
  60.  
  61. Second hand parts hoarders can figure out what they have, just by plugging it
  62. in and running PCI - no more scratching your head over a mystery card you just
  63. stumbled across amongst your latest piles of aquired junk. As above, finding
  64. drivers becomes much easier when you can say *exactly* what brand model, and
  65. revision of card you have.
  66.  
  67. To a programmer, PCI is a learning tool, since it's full source code is
  68. supplied, and the dump configuration-space feature will help a programmer
  69. discover how a driver alters the hardware to activate special features or
  70. generally work with a given device.
  71.  
  72.  
  73.  
  74.  
  75.   ■ Using PCI
  76.  
  77. Just run it. Read the output. Be happy!
  78.  
  79. Syntax: PCI [/H] [/D] [/S] [/T] [/B] [/P] [/?]             ([] = optional)
  80.  
  81. Commandline parameters:
  82.  
  83.   /H   Use direct-hardware access to retrieve the information. Normally, the
  84. system BIOS is called on to retrieve the information, however there are some
  85. BIOS's (Some Award v4.51 on Intel 430FX Chipset, early Compaq's using the
  86. Triflex Bridge chip) that incorrectly report some information. By bypassing the
  87. BIOS, we can get the correct information. This only works if the BIOS uses
  88. configuration mechanism 1. Mechanism 2 systems can use the BIOS method only.
  89. Mechanism 2 systems are virtually non-existant as version 2.1 of the PCI
  90. specifications insists on the use of mechanism 1 only.
  91.  
  92.   /D   Dump the PCI configuration space for each device. This option generates
  93. a 256 byte hex-dump of the PCI configuration space for each detected device.
  94. This is handy for people trying to learn to program a device, for those looking
  95. to discover any 'extra' undocumented registers in a device, observe the changes
  96. made by setup or driver software, and also to fault-find this program :-)
  97.  
  98.   /S   Produce summary report only. Lists vendors, devices, subsystem ID's
  99. and IRQ's only. Usefull for when you need a "quick glance" and don't want to
  100. wade through mountains of technical info. Still displays subsystem and IRQ
  101. info, as these are typically the most-used features of PCI.
  102.  
  103.  /T    Disble the BIOS IRQ Routing table tests. May be usefull if PCI crashes
  104. during this test, or you don't want to clutter up a device report with this
  105. 'extra' info.
  106.  
  107.  /B    List Bus, Device and Function info for each device. The bus number
  108. tells you which PCI bus the device resides on (look at the PCI bridges to see
  109. which bus number is 'created' by which bridge). The Device number is the PCI
  110. device identifier for that device on that bus (there can be 32 devices on each
  111. bus, and device numbers are generally non-contiguous). The function number is
  112. the internal sub-funtion of that PCI CHIP (many devices are single-function and
  113. only have a valid function 0, whilst others are multi-function and contain
  114. several sub-functions; each device may have as many as 8 sub-functions).
  115.  
  116.  /P    Read and display PCI IRQ-router information. The IRQ router is the
  117. device that connects the PCI slots INTA-INTD lines to the sytem's 16 IRQ lines.
  118.  
  119. The first part of this option shows what IRQ's are *potentially* available for
  120. the BIOS to connect each PCI slot. If you see Slot 00, it's a motherboard
  121. device, not a physical slot. You can work out which slot is which by using the
  122. /B command line parameter to display the Device & Bus info for each card, and
  123. then match this info up by looking physically at which card is in which slot.
  124. Typically slots of the same bus run in order, either left to right, or right to
  125. left; but different busses may be ordered differently to each other. Typically,
  126. all slots of a given bus are physically next to each other rather than bieng
  127. randomly distributed.
  128.  
  129. The second part of this option displays a table of slots and INTA-D link
  130. values. To interpret this table, first note that a non-zero link value under
  131. INTx means that that INTx pin on that PCI socket is wired to the IRQ router's
  132. <number xx> input. A 00 means that INT line is not connected *at all*.
  133.  
  134. Let's look at a typical table:
  135.  
  136.    SLOT BUS DEV   INTA INTB INTC INTD
  137.     01   0  17     01   02   03   05
  138.     02   0  18     02   03   05   01
  139.     03   0  19     03   05   01   02
  140.     04   0  20     05   01   02   03
  141.     00   0   1     01   02   03   05
  142.  
  143. What this table tells us is that Slot 01 and Slot 00 share the SAME link
  144. values, whilst the other 3 sockets each have different link values (under each
  145. INT line). How is this important? Each *link value* is mapped to a system IRQ,
  146. (but only if the PCI card signals that it requires an IRQ).
  147.  
  148. If Slot 00 and slot 01 are both populated (with cards that request an IRQ on
  149. the same INT line), they will both be assigned the SAME IRQ! similarly, if a
  150. card using INTD in Slot 2 and a card using INTB in slot 4 both require IRQ's,
  151. they will each be configured to the same IRQ. Depending on your OS, this may or
  152. may not be a good thing - some OS's don't support shared IRQs in this fashion
  153. (A.K.A.  the dreaded IRQ conflict) You may also want to know if you're going to
  154. get an IRQ conflict if you're about to fit a new card and don't want to use
  155. "trial and error" to get a non-shared IRQ assignment.
  156.  
  157. This table also highlights the other interesting points - if two slots have
  158. different link values under the same INT line, they CANNOT be configured to the
  159. SAME IRQ! Each slot will always be assigned a different IRQ from each other.
  160. Also, once a link-value has been assigned an IRQ, all other slots where that
  161. link value appears automatically take on that IRQ, so in many (but not all)
  162. cases you can predict what IRQ you will get when you fit a card to that slot.
  163. This sort of prediction an help in, for example, bulk-loading pre-configured
  164. software images into mass-produced systems.
  165.  
  166. If you have IRQ assignment problems, these tables may highlight why - perhaps a
  167. certain slot is incapable of having a desired IRQ assigned, or perhaps a given
  168. slot has a certain INTx line not connected. Careful examination of these tables
  169. will tell you straight away if this is the case or not.
  170.  
  171. The only thing this table won't tell you is which IRQ the BIOS will actually
  172. assign each slot - there is no way to determine this and most BIOS's seem to
  173. have no logical sequence for assigning resources; you get what you get! At
  174. least PCI will tell you what the BIOS has done, and it's up to you to decide if
  175. it's what you want, or not.
  176.  
  177. For more info, see also "PCI System Architecture" by Mindshare, inc. Chapter 11
  178. has several diagrams (figures 11-4 and 11-5 in the third edition, pp216-217) of
  179. IRQ router implementations that make this a lot easier to understand!
  180.  
  181. Finally, don't worry about the actual numerical link value (except for 00, of
  182. course) - that only has meaning to the BIOS; all we're looking for is the
  183. patterns the numbers represent, the numbers themselves are meaningless;
  184. letters, cute pictures, roman numerals, colours, whatever! would serve the same
  185. purpose just as well.
  186.  
  187.  
  188. PCI's output can also be redirected (using MS-DOS pipes), for example to a
  189. textfile on disk or a printer. IE "C:\>PCI > LOG" will generate a file on disk
  190. called LOG. This is handy if you want to keep a perminant record of the system
  191. under test, print it out, e-mail it to me, or whatever.
  192.  
  193.  
  194.  
  195.  ■ What's the ROM IRQ routing table and IRQ-router info?
  196.  
  197. The PCI ROM IRQ routing table is a scheme devised by Microsoft to assist
  198. Windows Device Manager to reprogram PCI IRQs. It falls under the category of
  199. 'plug and play' support and is pretty much a vital component of any motherboard
  200. these days. Normally, PCI IRQ's are set by the BIOS at boot time, and cannot be
  201. changed after the system is booted.
  202.  
  203. Microsoft didn't like that and so they devised a mechanism to allows Windows to
  204. change the IRQ assignments after boot-time. This makes sense, since Windows is
  205. much more capable of handling scenarios like hot-docking (and the shuffling of
  206. resources that this creates), that the BIOS clearly can't cope with in real
  207. time or hope to forsee at boot time.
  208.  
  209. The IRQ-router info is a PCI BIOS call that predates the ROM IRQ routing table,
  210. but offers similar information. The two should always agree! The disadvantage
  211. of the BIOS call is primarily that it is slow, but also that it is based on the
  212. very earliest versions of the PCI specifications, and thus lacks the
  213. expandability and flexability of the newer ROM routing table, for future
  214. growth.
  215.  
  216. The PCI standards say that the hardware vendors are free to connect PCI INT
  217. lines to system IRQ's in any fashion they like; there is no "standard". Since
  218. this is the case, Windows needs to know a few things such as which INT's can be
  219. routed to which IRQs, which INT-to-IRQ mappings are fixed, and which INTs
  220. belong exclusively to PCI. With that data in hand, Windows can re-configure
  221. IRQs for PCI devices when/if required to resolve resource conflicts (in
  222. conjunction with all the other resource data that Device Manager holds),
  223. because the user has requested a specific resource setting, because of a
  224. hot-dock event, Cardbus PC Card event, or whatever.
  225.  
  226. Only win95B (OSR2) or later supports this standard - Win95 original and OSR1
  227. don't.... under 95A, PCI IRQ resources are fixed (Windows uses whatever the
  228. BIOS assigned at boot time, and can't alter them) which is yet another reason
  229. not to use 95A, if you still do! 95A is particularly lousy at managing any sort
  230. of dockable/Cardbus equipped laptop.
  231.  
  232. The knowledge that the routing table(s) are present and valid is therefore
  233. essential for determining why Windows is or is not correctly handling PCI IRQ
  234. resoures. All modern motherboards should support the ROM routing table - but
  235. many don't, or the table is faulty; PCI therefore is able to tell us at a
  236. glance, wether IRQ management within windows is possible on that motherboard,
  237. and wether the ROM table is in working order or not. I strongly suggest you
  238. don't invest in any motherboard that has a non-existent or faulty
  239. implementation of the ROM IRQ routing table. Needless to say, a dockable and/or
  240. cardbus equipped laptop without a working routing table is going to be nothing
  241. but trouble.
  242.  
  243. Many motherbards can gain (or fix bugs in) routing table support with a
  244. FlashBIOS upgrade - visit your motherboard vendor's website (or
  245. www.ping.be/bios) for the latest FlashBIOS and see if that helps. Complain
  246. loudly to any vendor with a buggy routing table; with the advent of Win2000,
  247. and the growing popularity of dockable laptops, this sort of thing is going to
  248. be an absolute minimum requirement (along with ACPI support, for example) for a
  249. true overall 'plug and play' operating environment.
  250.  
  251.  
  252.  
  253.  ■ Bugs, stuff yet to come, limitations, etc.
  254.  
  255. PCI is known to not operate under Windows NT or 2000. If you run NT/2000, you
  256. must boot with DOS or Win95/98 to run PCI. This is because NT's HAL denies PCI
  257. access to the system BIOS and I/O ports necssary for PCI to operate.
  258.  
  259.  
  260. Basically, full decoding of all the PCI data is yet to be implemented... mainly
  261. because I don't own a copy of the 'official' PCI specification documents, (And
  262. I am unable to get them as they cost $$$ and I don't live in the USA so I have
  263. no easy way to transmit payment...presuming I wanted to pay for them at all)
  264. So, I am reliant on snippets of information collated from books, data sheets,
  265. YOUR INPUT, etc etc. See the web page for more info, and the text of the next
  266. section.
  267.  
  268. Having said that, PCI is now a very mature product (developed now for nearly 5
  269. years) and it is 'virtually' complete. There isn't much left to do!
  270.  
  271.  
  272.  
  273.  
  274.  ■ And to the PCI SIG:
  275.  
  276. Official PCI Programming information is not freely available. The controlling
  277. body the "PCI Special Interest Group" has determined that documentation will be
  278. made available to those willing to pay for it. And it's not cheap, or easily
  279. obtainable outside the USA. I have the following to say to the PCI SIG:
  280.  
  281. Charging money for your documentation not only restricts programmers and end
  282. users from adopting the PCI standard, but makes a mockery of the concept of
  283. open information sharing that the Internet has always stood for. Rather than
  284. take such a petty attitude towards Joe Average programmer, why not release your
  285. documentation freely in electronic format? It can only help establish your
  286. standards further.
  287.  
  288. Freely releasing formal documentation would also mean that programmers such as
  289. myself can stop guessing about PCI, and stop writing up alternative
  290. documentation that may ultimately be incorrect. I'm sure that the current host
  291. of "third party" documentation (along with it's errors) can only make PCI look
  292. BAD, not good.
  293.  
  294. Remember MCA? In 1987 we already had what PCI now offers.. please don't kill
  295. PCI the same way IBM killed MCA.
  296.  
  297.  
  298.  
  299.  
  300.  
  301.  ■ How to "parse" PCIDEVS.TXT
  302.  
  303. Writing your own code to use my database? GREAT! You're more than welcome: the
  304. database is freeware and you may use it for any purpose, including commercial
  305. purposes. Here's how *I* parse the list, in "pseudocode". I hope this makes it
  306. easier for you to write a parser too. Please forgive me if you think this is
  307. poorly designed/could be done better; the technique stems from three things:
  308.  
  309. - Sourcefile is TEXT, not Binary, so there are no fixed field lengths.
  310. - Many fields are optional so the catch-22 of "you dunno if it's there 'till
  311.   you read it, but once you've read it, you can't go back a line if it wasn't
  312.   what you expected" applies.
  313. - The program has been added to and expanded "ad hoc" over a 5 year period.
  314.   Inevitable oversights and extensions have been dealt with several times.
  315. - The basic file format can't be changed since there are many programs
  316.   (including a couple of commercial packages) relying on my file format not
  317.   changing.
  318.  
  319.  
  320.  
  321.  
  322.  
  323. Open the file as text (not binary) and read top to bottom, one line at a time.
  324.  
  325. 1. Look for V entries, until you make a match to the vendor ID, or EOF in which
  326. case report unknown vendor & device. Display Vendor Name.
  327.  
  328. <the file position pointer now points to the list of devices for that Vendor>
  329.  
  330.  
  331. 2. Read D entries until you get a match to the device ID, or hit another V
  332. entry or EOF in which case stop and report unknown device. DONT display Device
  333. Name yet!!
  334.  
  335. <the file position pointer now points to possible device revision records>
  336.  
  337.  
  338. 3. Read R entries until you get a match with the device's revision ID, or you
  339. run out of R entries, or EOF. (There may be no R entries at all). If you match
  340. R, then display that entry for the Device Name, otherwise display the Device
  341. Name from the D entry... R is more accurate than D.
  342.  
  343. <the file position pointer now points to possible subsystem records>
  344.  
  345.  
  346. 4. If you matched D(and/or R), and the subsystem ID is <>00000000 then (look
  347. for subsystem match):
  348.  
  349.    in a loop, read a line, and
  350.      - try to match an X code with the 8 digit subsystem ID.
  351.      - try to match an O code with your subsystem vendor ID. Remember the
  352.        "generic" part description. Note the match, Keep going in this loop.
  353.      - try to match an S code with your subsystem device ID, but only if the O
  354.        code has already been matched.
  355.    exit when you matched an X code, or (matched an S AND an O code), EOF, or
  356.    you hit another V or D code.
  357.  
  358. - if you EOF or matched neither X, O nor S, report unknown subsystem ID.
  359. - if you matched and X entry, report info next to X entry, and warn user this
  360. is a known "oddball" device that has an otherwise invalid subsystem ID. (Ignore
  361. any partial S-but-not-O match, if any - its a false alarm).
  362. - if you matched O BUT NOT S, report the "generic" ID you remembered. Warn
  363. user it may not be "fully" accurate, but is just a guestimation.
  364. - if you matched O AND S, report info next to S entry; you exactly matched the
  365. subsystem ID.
  366.  
  367. 5. close list
  368.  
  369. 6. If you have an O code, re-open the list. Scan list reading the V entries,
  370. but try to match with the O code. This tells you the OEM name. Stop at match or
  371. EOF. If EOF, report unknown OEM ID. Close list.
  372.  
  373. List must be closed and re-opened because the O name may be "higher" up the
  374. list, thus a scan-to-the-end of the list will not match. This also means this
  375. check must be done last since it causes us to "loose our spot" in the list.
  376. Filepos() doesn't work (in Pascal, at least) since we're working with a
  377. textfile!! (Argh!!)
  378.  
  379. If you find an invalid code letter, IGNORE IT; just move onto the next line.
  380. This lets us add new code letters and not 'break' existing code.
  381.  
  382.  
  383.  
  384.  
  385.  ■ Other formatting notes for PCIDEVS.TXT:
  386.  
  387. All useful lines are formatted thus:
  388.  
  389. <Code Letter><Tab><2-8 hex digits><tab><text>
  390.  
  391. You may NOT replace <tab> with <space>! Also, do NOT replace a tab with eight
  392. spaces!!! the parser counts characters left to right, and looks for the tab
  393. character, so wrong, extra or missing characters will result in a wrongly
  394. parsed line. This means the file formatting must be kept strictly in check at
  395. all times.
  396.  
  397. Overall, total line length must be 255 characters or less. Try to keep the text
  398. under about 70 chars for display legibilty (excessive display wordwrap really
  399. is in poor taste :-/)
  400.  
  401. All entries must always follow numerical order, lowest to highest. This makes
  402. duplicates almost impossible when editing, but the parser doesn't actually
  403. care, since it works on "keep looking until you run out" principle. A "tiny"
  404. efficiency could be added by coding in "if database ID > our ID, give up" but I
  405. hardly see the point, since the program runs faster than you can blink anyhow.
  406.  
  407. You should ignore all lines not starting with a valid code letter,tab sequence.
  408. This allows clarity by inserting blank lines and comments wherever it may
  409. please you. for clarity, begin comment lines with a <;> character; Accidental
  410. capitilisation of the first word of a comment could lead to a wrongly parsed
  411. code.
  412.  
  413. Valid Codes:
  414.  
  415.   V    Vendor ID. 4 digit hex number.
  416.   D    Device ID. 4 digit hex number.
  417.   R    Revision ID. 2 digit hex number.
  418.   X    Incorrectly formatted susbsystem ID. 8 digit hex number.
  419.   O    Subsystem OEM ID. 4 digit hex number. (top 16 bits of subsystem ID)
  420.   S    Subsystem device ID. 4 digit hex number. (low 16 bits of subsystem ID)
  421.  
  422. The codes must always appear in this order in the file. Multiple O and S
  423. entries may appear. O entries may appear without S entries. Only V and D
  424. entries are required to identify a device - all others are optional and my be
  425. omitted.
  426.  
  427. A note on R entries: R is NOT permitted under a subsystem entry. A chipset
  428. revision is just that - the BASE CHIPSET's revision. The OEM can't have any
  429. influence on the chipset's revision, since he doesn't make it! Thus, R is of no
  430. use under the subsystem. I very much doubt any OEM has made two different model
  431. cards by carefully buying different revision chips from the chipset vendor!!
  432.  
  433. A note on X entries: X entries are very rare. In the "early days" of subsystem
  434. ID's, some vendors apparently thought they had carte blanche to put in any
  435. number they liked. WRONG! However a few devices now exist with nonsensical
  436. subsystem ID's like "55555555" or "F0F01234" and suchlike. X entries take care
  437. of these few "oddball" devices. I don't expect to add any more than one or two
  438. new X entries, ever.
  439.  
  440. ** New code letters may be added from time to time, so your code should always
  441. ignore any unknown code letters. This lets up expand the scope of the file
  442. without 'breaking' existing code.
  443.  
  444.  
  445.  
  446.  ■ Program Revision Information
  447.  
  448.   version 0.00ß : Initial private release: Didn't crash my home PC!
  449.  
  450.   version 0.10ß : fixed bug whereby if either vendor byte is $FF, we would
  451.                   skip the device. Ouch! Now finds devices reported as xxFF on
  452.                   some buggy Award BIOS's chipsets. (Notibly, 80FF, not 8086
  453.           for the 82430FX IDE Ctrlr).
  454.           fixed problem decoding infotable[6].
  455.           fixed select timing decoding fixed irq=$ff decoding
  456.  
  457.   version 0.11ß : fixed bug displaying select timing modes
  458.  
  459.   version 0.12ß : added "subsystem id" information display
  460.           made cache line size display only if it exists (ie is<>0)
  461.           added /H parameter to use cfg mechanism 1, not BIOS to
  462.           read the hardware directly (gets around 80FF bug)
  463.           added bus mastering capability & latency reporting
  464.           added prefetchability reporting to memory ranges
  465.           fixed up several minor display and reporting issues
  466.           made IRQ display only if it's valid
  467.  
  468.   version 0.13ß : fixed some display formatting bugs
  469.           subsystem ID's only displayed if valid (<>00000000)
  470.           Added subsystem recognition system (after many requests)
  471.           Added ability to direct output to a file ie "C:\>pci > log"
  472.  
  473.   version 0.14ß : Added commandline parameter /D to dump device configuration
  474.           space, if required. This is usefull when programming a
  475.           PCI device, and/or looking for 'hidden' registers, features,
  476.           etc etc.
  477.  
  478.   version 0.15ß : added subsystem vendor display; it's not always accurate,
  479.           (Some vendors are ignoring the rules) but when it is right,
  480.           it can be very useful.
  481.           Added capabilities list decoding & display - not yet tested!
  482.           Tidied up the code here and there - fixing my cruddy coding
  483.           fixed major bugs with Expansion ROM info display
  484.           fixed minor potential bug with I/O port decoding
  485.           added interface type to class code line
  486.  
  487.   version 0.16ß : Fixed a stupid bug with new capabilities list display
  488.           Added raw-dump of Power Management capability data
  489.  
  490.   version 0.17ß : fixed some minor display formatting problems
  491.           fixed several problems decoding type 2 headers
  492.           fixed another bug with expansion ROM decoding
  493.           added some more decoding of type 1 headers
  494.           added some more decoding of type 2 headers
  495.           added info on PCI IDE controllers & mode(s) of operation
  496.           added error checking for case of VENDORS.TXT missing
  497.           added some decoding of "power management" new capability
  498.  
  499.   version 0.18ß : fixed display formatting bug with PCI IDE info
  500.  
  501.   version 0.19ß : added IRQ summary to end of display
  502.           added generic subsystem ID detection & note
  503.           fixed compiler leaving debug-info in EXE
  504.           cleaned up a few minor display issues
  505.  
  506.   version 0.20ß : added several new class codes intoduced with PCI spec v2.2
  507.           added decoding of command register
  508.           fixed "status 0200h ()" display formatting bug & redrew
  509.           the general layout of the Status info to avoid commom
  510.           wordwrap problem and to more correctly display timing +
  511.           busmaster info next to their "source" register
  512.           fixed "Number of PCI busses : 0"
  513.  
  514.   version 0.21ß : added MSI Capability detection
  515.           added shared IRQ summary
  516.           indented capabilities listings to make them more readable
  517.           fixed error in classes.pas missing out the last few entries
  518.           added ExpROM decode for type 1 headers
  519.           added I/O port range decode for PCI Bridges
  520.           fixed display wordwrap problems
  521.           full decoding of Self Test function byte
  522.  
  523.   version 0.30ß : converted to PCIDEVS.TXT format, added subsystem prediction
  524.                   code
  525.  
  526.   version 0.31ß : fixed slight bug with unknown subsystem vendor ID
  527.           added /S parameter for brief summary only report
  528.           changed IRQ reporting to reject bad IRQ values (0<IRQ<16)
  529.           this fixes runtime error 201 on compaq triflex bridge!
  530.  
  531.   version 0.32ß : added revision ID decoding for more accurate chipset-id
  532.           added a load of info in the documentation on PCIDEVS.TXT
  533.           structure, parsing, etc
  534.           fixed problem with IRQ list wrong in summary mode because IDE
  535.           IRQs not recorded
  536.           Updated help to current featre set
  537.  
  538.   version 0.33ß : added PCI IRQ Routing table Win9x compatibility tests
  539.  
  540.   version 0.34ß : fixed some bugs in new routing table check routine
  541.  
  542.   version 0.35ß : fixed capability pointer bug with type 1 headers
  543.           IRQ summary display formatting fixed
  544.           PCI major revision number leading 0 dropped
  545.           help page again fits into one 25 line screen
  546.           added display bus/device/function info option
  547.  
  548.   version 0.40ß : added 'None' to "IRQ's dedicated to PCI" for when there are
  549.             truely none reported in the IRQ routing table info
  550.           added first attempt at PCI slot INTx routing data display
  551.           fixed a bug in "IRQ's dedicated to PCI" omitting IRQ 15
  552.           added latest PCI 2.2 class codes; fixed bugs in classes code
  553.           better error checking on AGP capability list
  554.  
  555. <EOF>