- 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.
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.