First post, by Oerg866
Hi,
this is IVXWAIT, a MS-DOS program for Motherboards with a PIIX3 to set 8- and 16-Bit ISA I/O recovery cycles (or wait states if you want to call it that).
It can help fix ISA devices such as OPL3 malfunctioning due to timing issues.
Screenshots:
Backstory:
I had a problem the other day .
My Cyrix PC's sound card's OPL3 (It's a YMF719-based card) would misbehave with a few programs (Adlib Tracker 2, HSC Tracker), but work just fine with most games and other software. The misbehaving software would only emit garbage noises, if anything. Under Windows 95, they would produce silence unless tabbed-out.
Check the clips if you're interested:
Clip 1 from Reality Adlib Tracker (Works)
Clip 2 from Adlib Tracker 2 (Broken, WARNING, EXTREMELY LOUD!!!)
Tiido and I shared the opinion that this is a timing problem, probably caused by lack of wait states after the I/Os and the software being too optimistic.
Problem: My ECS P5VX-Be does not have a BIOS option to set this up - oops! Thankfully the ISA Bridge has a public datasheet (here).
The I/O recovery timer is cofigured using register 0x4C in function 0 of the PCI device (PCI\VEN_8086&DEV_7000). So I thought, why not write a tool to configure this? Maybe it fixes my problem, and if not, at least I learned something new!
I had never written code to access PCI devices before, so this was an interesting challenge, fueled by the fact that I wanted to do this in Real Mode with a contemporary compiler (in this case Borland Turbo C++ 3.0). Most, if not all of these lack any semblence of understanding that something like a 386 even exists (it's the 90s, ffs!), so doing the required 32-bit I/O to acces PCI config space is a no-go. So I had to do this using inline assembly and manually placed opcodes (using "db").
It's hacky, but I think it's cool and hey, after setting 8-Bit recovery time to 6 clock cycles using my new tool, Adlib Tracker finally works perfectly!