Biosmods homepage
Do NOT try this at home or work, unless You know the risk of these operations!

Here is how to modify award bios to change the default pci registers:
My problem was that some defaults of the configuration of ASUS TUV4X motherboard are somehow incompatible with SMC 1255TX network card. After some investigation we found that changing the 0x73 register of the VIA chipset (694T with 686B south bridge) solves the problem.
Here is a sample list of PCI configuration / chipset settings:
 (Linux: lspci -xxx) 
00:00.0 Host bridge: VIA
Technologies, Inc.: Unknown device 0305 (rev 03) 
00: 06 11 05 03 06 00 10 a2 03 00 00 06 00 00 00 00 
10: 08 00 00 d0 00 00 00 00 00 00 00 00 00 00 00 00 
20: 00 00 00 00 00 00 00 00 00 00 00 00 7b 14 01 a4 
30: 00 00 00 00 a0 00 00 00 00 00 00 00 00 00 00 00 
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
50: 16 f4 eb b4 06 00 08 08 80 00 08 08 08 08 08 08
60: 03 0a 00 20 e4 d4 d4 c4 50 28 65 0d 08 3f 00 00 
70: d0 88 cc 0c 0e 80 e2 00 01 b4 19 02 00 00 00 00 
80: 0f 40 00 00 c0 00 00 00 03 00 25 01 00 00 00 00 
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 32 00 00 
a0: 02 c0 20 00 03 02 00 1f 00 00 00 00 2b 12 00 00 
b0: db 63 02 48 31 ff 80 0f 67 00 00 00 00 00 00 00 
c0: 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
f0: 00 00 00 00 00 03 03 00 22 00 00 00 00 00 00 00 

Our problem could be solve by setting the bit 6 and bit 7 of register 0x73 (original value:0Ch) to 1. (value:6Ch).
This can be done by using WPCREDIT.EXE utility. (Programming PCI bus registers seem not to be very hard, something like
 mov dx,0cf8h 
 mov al, register_number 
 out dx,al 
 mov dx,0cfch 
 mov al, value
 out dx,al 
But You should check it somewhere else like in the source of lspci.. ) So, WPCREDIT could change any value of the registers for some time till the next reboot. This is good, because if You do something nasty, a reset could solve the problem, but running WPCREDIT at every reboot seems not to be a stable solution.
There is another tool WPCRSET. This utility can load at boot time, and set the desired registers for You automatically. It is a nice solution for this problem, especially for NT and 98, but I don't know if it works under W2k or XP, and of course it won't help You under Linux.
There are other problems, too. First, after any windows reinstall You should apply (install) this patching program again, and as well if You change Your motherboard without uninstalling the tool, that could cause some problems too, even physical hardware damage.
So the best way to fix these problems could be changing these registers' default value in the BIOS. As BIOS images can uploaded by flasher programs (aflash.exe) this is not an impossible idea, but You have to modify the BIOS binary image to let this work.
There are some tools to BIOS modifcations (get here ):
1003.awd - The current BIOS image for ASUS TUV4X
cbrom.exe , cbrom6.exe (for award v6): These can be used to change different parts of the bios image. (Parts: EPA logo, main bios (original.tmp), pci bios, etc.). I could not use this utility to extract or replace original.tmp ...
modbin.exe and modbin6.exe:
These utilities could help You to solve this whole issue. modbin has some feature to change the default registers for chipset configuration, but:
-modbin6 shows up 'function disabled' for chipset default settings in my case
-modbin6 hangs sometimes
-modbin can load my (v6) image too, but it did not see the bios chipset register settings
-for older bioses it could change the default values, but only for those bits in those registers which where previously defined by bios.

Softice: Softice is a great debugger, You can use it to realtime disassemble-debug programs, and change memory content as well.
Hiew: A simple but good program to edit hex files manually.
So, first of all You should extract original.tmp from the packed bios file. For this, I used modbin (4.X). Start the program and load the image (1003.awd). Modbin will extract original.tmp to the working directory, until You update the file or abort the whole program. So after loading the file change Your window and copy original.tmp to some other file (copy original.tmp work.tmp)

The most important part is the next. You have to search for the chipset default settings. Luckily, the BIOS data structure for the chipset register defaults is very easy to find:
In our case this is the sample binary part:
00013FE4:  02 0D 00 FF-00 04 00 02-70 00 FF 00-C0 00 02 71  ??  ? ?p  + ?q
00013FF4:  00 FF 00 88-00 02 72 00-FF 00 4C 00-02 73 00 FF     ?r  L ?s 
00014004:  00 0C 00 02-74 00 FF 00-0E 00 02 75-00 FF 00 81   l ?t  ? ?u  
00014014:  00 02 76 00-FF 00 D2 00-02 53 00 20-00 20 00 02   ?v  - ?S     ?
00014024:  78 00 FE 00-00 00 02 79-00 FF 00 B4-00 02 AC 00  x    ?y   ?
00014034:  73 00 22 00-02 7A 00 FF-00 01 00 02-AD 00 1F 00  s " ?z  ? ? ?
00014044:  02 00 02 B0-00 80 00 00-00 02 40 08-FF 00 C8 00  ? ?    ?@? +
00014054:  02 41 08 FF-00 4D 00 02-42 08 FF 00-00 00 02 43  ?A? M ?B?   ?C
00014064:  08 FF 00 44-00 02 44 08-04 00 04 00-02 40 20 08  ? D ?D?? ? ?@ ?
00014074:  00 08 00 02-41 20 41 00-41 00 02 43-20 30 00 00   ? ?A A A ?C 0
00014084:  00 02 45 20-80 00 80 00-02 46 20 60-00 60 00 02   ?E   ?F ` ` ?
00014094:  48 20 02 00-00 00 02 4A-20 80 00 80-00 02 74 20  H ?   ?J   ?t
What does this mean:
02 70 00 FF 00 0C 00
02 is some separator between registers
70 00 is the id of the register 0x0070h
FF 00 is the mask of setting
0C 00 is the value to set

so the pseudocode:
var1=get_register(0x70);
var1=(var1 & (!0FFh)) | (0FFh & 0Ch);
set_register(0x70,var1);

So, at the end of the second line You see the register 0x73h, this is what I wanted to change from 0Ch to 6Ch. The mask bits for this byte are FF, so I don't have to change it. Ok, how to find this part? Every BIOS can contain default pre-defined registers and different values. It is likely that Your BIOS will have a pre-definition for register 0x70h (most of them have..). Search for 0x02 0x70 0x00. Check the hits for the structure. If it looks just like the one above, then You find it. As I've told, this whole method was used to mod the binary for ASUS TUV4X with VIA Apollo 133T, so do not expect wonders...

My problem was that if I change this original.tmp binary, I have to repack this file to the 1003.awd file. The other big problem that every original.tmp BIOS file has a checksum at the end of the file (2 bytes). If this checksum is bad, then Your computer can lock up at boot!
It is a great idea, that modbin.exe can modify some data in the orignal.tmp and repack the file for You. For example You can use modbin on a version6 file to change the bios 'name' field. Yes, this works, and modbin recalculates the good checksum, but it uses the file loaded in the memory not the temporary image file.
So, I used softice while loaded modbin.exe to search and change the bits of the desired registers and then used modbin to change the bios identification string, and to repack original.tmp into the .awd file.
(load softimage, load modbin, open .awd file, press crtl-d, enter "s 0 l ffffff 0x73 0x00 0xff 0x00 0x0c 0x00", enter "s" until You find the right one, enter "e"
Edit the contents
enter "s" until You've changed all the memory contents (It might contain copies from the same data)

Ok, After changing the memory content, get out of softice (crtl-d), change the BIOS id field, "update" the .awd file. Modbin calculates the new checksum.

A very important thing is the next: CHECK IT! Check all Your work again and again before using the new awd file. Check the original.tmp (use modbin to unpack it, and check for the register bits. Are they modified? Does the file have new (good) checksum field at the end of the file (1fffe)?
Then, is the .awd file o.k.? Can modbin manage to load it? Can cbrom6.exe show its contents? etc.
There are still problems remaining. What if BIOS does not initialize some PCI registers in this part but You wish to change them? I don't have a simple answer, but with this knowledge, I hope You can find the part more easily in the code, where the BIOS sets these registers (look for the out dx(=0cf8h),ax(al) parts... (Use IDA or W32Dasm)
After all these operations Your new .awd file is ready to flash. After flashing, reboot the system and use wpcredit or lspci to check Your work. Remember: Use all this info for Your own risk, and respect the copyrights on each files You use (programs, utilities and BIOS files). Ask Your lawyer... Changing, debugging, reverse engineering BIOS might be illegal in Your state!
Did it work? Not? Email me!
Some links:
My page
DC

programs
Lersok