my .p validation was proven too strict by Humpty Dumpty, so has been relaxed;

I've switched back to using one byte per pixel in the intermediate graphics buffer, at the cost of greater upload costs but so as to correct precision errors visible on some GPUs where the absolute edges of pixels would be peculiar;

an error in placement of the read port for the ZON-X has been corrected; and

if you were to read the AY prior to writing to it, you'd get more meaningful results. There's a write-through cache of AY register values on the emulated machine's thread that was not being properly initialised.

It has also been brought to my attention indirectly as a result of Earl Evans' appearance on Randy Kindig's FloppyDays podcast that this emulator joins SZ81 in being one of only two ZX81 emulators that get a perfect score from Dr. Carlo Delhez's clckfreq z80 instruction-length tester. Hooray!

That appears to be a 60Hz program? So it rolls a lot. Screenshot attached.

I see this discussion of adapting it to 50Hz; I'm just squeezing this test into a quick ten minutes before work so don't immediately have time for poking around but will try to see whether any solutions are available there.

Otherwise I guess I could try to make my emulated CRT the sort that can switch between 50 and 60Hz. For ZX81 usage it'd probably need to be a bit smarter about statistical accumulation: to do the equivalent thing for the 2600 it just sort of says "well if sync keeps coming at surprising times, I guess I should switch frequency"; that scheme isn't going to work versus the ordinary ZX81 loading display, for example.

EDIT: actually, looking a bit closer it looks like I might still be applying the wrong test for three-bit counter reset. I should probably implement support for NTSC machines anyway, so I'll check it out. But right now I'm still mentally processing options following yesterday's announcement that OpenGL will be deprecated in the next macOS. Time and tide, I guess.

Minor update; in full-screen mode it was previously possible to end up with a load of accumulated ugliness on the right-hand side of the display after loading. This is now fixed. The new release is where it always is.