Peter Stuge wrote:
On Thu, Jun 03, 2004 at 03:56:29AM -0500, Richard Smith wrote:
timer. In numerious locations my Vbios is writing a 0x00 to IO 0x43 and then does 2 reads from 0x40. So its latching the value of counter 0 and then reading it out.
Right, it also sets counter mode 0, zero detection interrupt. Are there any hints of the code actually using the interrupt anywhere?
Um... I don't know. What would I look for? I don't thing so but that does explain why linux whines about "too many timer interrutps" occurring.
The delay routine is written such that it polls for a rollover to mark the increment of 838.1 ns. For this to happen the latch values must be equal. In a system where the cpu instructions are running much faster than one timer clock cycle I guess would not be much of a problem.
838.1ns is one tick, not a complete 16-bit rollover, right?
Yeah sorry. 838.1 ns is one tick. I said rollover which would be 50mS Re-looking at the delay routine I see I was mistaken as the delay routine counts ticks.
Looking at the delay routine is just confusing. There's a comment that says 4 bx counts equals .4290 * 4 or 2uS. So that tells me the VBios thinks the system timer must be running at 2.386 Mhz rather than the 1.19318 Mhz my PC hardware book claims.
All this tells me that I don't understand timer access in a modern system. The code as written just dosen't seem like it would work on a 4.77 Mhz XT.
The resolution could be lowered.. Are there any writes to 0x40 setting a divisor? If not, then the snippet will simply not be reliable down to the exact iteration.
Since the code uses jb to detect when to stop looping the count doesn't have to be an exact match. Even if an extra tick passes, the loop will still end.
I don't understand. The part I'm refering to is the
sub ax,dx neg ax
or ax,ax jnz delay_a
This will only skip the jump (and do the BX decrement) if ax is zero. For ax to be zero the result of the 2's complement subtraction must be zero or the when the 2 reads are the same number. But I just don't see how this would happen repeatably at .6us per ISA IO.
Ate the timer reads really and ISA IO? I guess if those reads are happening much faster then it would work. Where does the timer live now? int the northbridge perhpas? Thats could be the issue. If the northbridge responded to the IO it would happen at cpu clock rates and all would be well.