如何在 ZX Spectrum 上找到电子枪的位置(即主动改变像素/扫描线)?
不同的 Spectrum 型号的时间略有不同。
如果这是不可能的,有没有办法等待某种形式的垂直同步事件?(即在屏幕底部的顶部。)
如何在 ZX Spectrum 上找到电子枪的位置(即主动改变像素/扫描线)?
不同的 Spectrum 型号的时间略有不同。
如果这是不可能的,有没有办法等待某种形式的垂直同步事件?(即在屏幕底部的顶部。)
There is a 3 byte frame counter at address 23672.
23672 FRAMES
3 byte (least significant first), frame counter. Incremented every 20ms.
I'm making the assumption that this is incremented by the 50Hz interrupt. So I'll just poll it in a loop until the least significant byte changes.
您拥有的唯一可靠的同步事件是在屏幕刷新的垂直空白期开始时产生的 50Hz 中断。
基本上,您有两种选择。绝大多数人只会从中断等待屏幕开始。对于不同的模型和克隆,所需的等待时间是不同的。大多数依赖这种精确时间的程序只支持一两个模型。最先进的程序会尝试识别特定的克隆/模型并相应地调整时间,但由于任务的复杂性和缺乏足够详细的文档,没有人基于这种方法创建真正可移植的程序在许多模型上。
第二个选项是使用端口#FF。它不是一个真正的端口,但从它读取会返回 ULA 当前从屏幕获取的字节的值(或 255)。因此,可以在中断上同步,然后轮询端口#FF,直到它返回不同于 255 的值(假设您的屏幕包含不同的内容)。但是,请注意,一些常见的 Spectrum 模型,例如 +2A 和 +3,没有这种行为,所以再一次,如果您对支持的模型的良好覆盖感兴趣,这不是一个选择。
那是很久以前的事了,但我记得有一个内存刷新计数器会针对每条扫描线进行更新。如果在 vblank 将其设置为 0,它将包含当前扫描线。