Sounds like a good idea, but first, I have a better plan to debunk what he's saying:
Super Star Soldier, a game he claims is sensitive to this:
Code: Select all
reading io (pc e15b), select 1, clr 0, frame 3c0 scanline 101
reading io (pc e16b), select 0, clr 0, frame 3c0 scanline 101
reading io (pc e15b), select 1, clr 0, frame 3c0 scanline 101
reading io (pc e16b), select 0, clr 0, frame 3c0 scanline 101
reading io (pc e15b), select 1, clr 0, frame 3c0 scanline 102
reading io (pc e16b), select 0, clr 0, frame 3c0 scanline 102
reading io (pc e15b), select 1, clr 0, frame 3c0 scanline 102
reading io (pc e16b), select 0, clr 0, frame 3c0 scanline 102
reading io (pc e15b), select 1, clr 0, frame 3c0 scanline 102
reading io (pc e16b), select 0, clr 0, frame 3c0 scanline 102
reading io (pc e15b), select 1, clr 0, frame 3c1 scanline 101
reading io (pc e16b), select 0, clr 0, frame 3c1 scanline 101
reading io (pc e15b), select 1, clr 0, frame 3c1 scanline 101
reading io (pc e16b), select 0, clr 0, frame 3c1 scanline 101
reading io (pc e15b), select 1, clr 0, frame 3c1 scanline 102
reading io (pc e16b), select 0, clr 0, frame 3c1 scanline 102
reading io (pc e15b), select 1, clr 0, frame 3c1 scanline 102
reading io (pc e16b), select 0, clr 0, frame 3c1 scanline 102
reading io (pc e15b), select 1, clr 0, frame 3c1 scanline 102
reading io (pc e16b), select 0, clr 0, frame 3c1 scanline 102
reading io (pc e15b), select 1, clr 0, frame 3c2 scanline 101
reading io (pc e16b), select 0, clr 0, frame 3c2 scanline 101
reading io (pc e15b), select 1, clr 0, frame 3c2 scanline 101
reading io (pc e16b), select 0, clr 0, frame 3c2 scanline 101
reading io (pc e15b), select 1, clr 0, frame 3c2 scanline 102
reading io (pc e16b), select 0, clr 0, frame 3c2 scanline 102
reading io (pc e15b), select 1, clr 0, frame 3c2 scanline 102
reading io (pc e16b), select 0, clr 0, frame 3c2 scanline 102
reading io (pc e15b), select 1, clr 0, frame 3c2 scanline 102
reading io (pc e16b), select 0, clr 0, frame 3c2 scanline 102
Naxat Open, the other game he pointed out, follows the same story:
Code: Select all
reading io (pc ee48), select 1, clr 0, frame 6dd scanline 90
reading io (pc ee58), select 0, clr 0, frame 6dd scanline 90
reading io (pc ee48), select 1, clr 0, frame 6dd scanline 91
reading io (pc ee58), select 0, clr 0, frame 6dd scanline 91
reading io (pc ee48), select 1, clr 0, frame 6dd scanline 91
reading io (pc ee58), select 0, clr 0, frame 6dd scanline 91
reading io (pc ee48), select 1, clr 0, frame 6dd scanline 91
reading io (pc ee58), select 0, clr 0, frame 6dd scanline 91
reading io (pc ee48), select 1, clr 0, frame 6dd scanline 91
reading io (pc ee58), select 0, clr 0, frame 6dd scanline 91
reading io (pc ee48), select 1, clr 0, frame 6de scanline 90
reading io (pc ee58), select 0, clr 0, frame 6de scanline 90
reading io (pc ee48), select 1, clr 0, frame 6de scanline 90
reading io (pc ee58), select 0, clr 0, frame 6de scanline 90
reading io (pc ee48), select 1, clr 0, frame 6de scanline 90
reading io (pc ee58), select 0, clr 0, frame 6de scanline 90
reading io (pc ee48), select 1, clr 0, frame 6de scanline 91
reading io (pc ee58), select 0, clr 0, frame 6de scanline 91
reading io (pc ee48), select 1, clr 0, frame 6de scanline 91
reading io (pc ee58), select 0, clr 0, frame 6de scanline 91
It looks like it's read several times per frame, but actually it's just polling all of the controller states - notice how it always happens within two scanlines. Sometimes it happens a little later, but never takes more than two scanlines, and this is probably just the code taking a certain amount of time. In other words, the polling is not distributed throughout the frame.
But let's say it were and "method 1" were implemented. In an efficient emulator the emulation may only take 10% of the actual frame time. So polling at the point where it's read isn't going to really make a difference, unless you continue to follow a heuristic of when it'll be read. I think blargg already touched on this.
The only method remaining is the "b" method, however, getting precision timing at 4x the frame rate can start to get quite cumbersome, even with high resolution timers. That is, unless idle loops are done, but I'm sure we don't want to resort to such a thing. Even then, this placing much higher real time requirements on the code.
If the time of polling really is an issue, then maybe you can track it in the emulator and try to distribute the frame so the waits are made around that point, and no more than that. I still think none of this is really necessarily, though (and his real issue is with driver or hardware problems)
He also said that the multi-synchronization would improve audio and timer emulation. I don't see how these things are relevant. There should only one variable when it comes to audio, and that's global latency. This might be more noticeable for sound effects that have a clearer frame of reference, but it'll always be there and it'll always be the same amount, depending on what the audio buffering is like (and it'll be impossible to have it anywhere near zero latency). Suggesting that decreasing emulation quanta improves accuracy of PSG emulation means that he probably tied the audio generation to the audio output, when these things can be kept separate. Then you can update the generation as low level as you want (every clock cycle if you really feel like it) without having to wait any amounts, as it'll all be read off of the buffer its generated to when it's needed.