如何在ZX Spectrum上找到电子枪的位置(即主动改变像素/扫描线)?
不同的频谱模型的时序略有不同。
如果无法做到这一点,有没有办法等待某种形式的垂直同步事件? (即在屏幕底部的顶部。)
答案 0 :(得分:0)
唯一可靠的同步事件是在屏幕刷新的垂直空白周期开始时产生的50Hz中断。
基本上,您有两种选择。绝大多数人只是等待从中断到屏幕的开始。对于不同的模型和克隆,必要的等待量是不同的。大多数依赖于这种精确计时的程序只支持一个或两个模型。最先进的程序将尝试识别一个特定的克隆/模型并相应地调整时间,但由于任务的复杂性和缺乏足够详细的文档,没有人创建过基于这种方法的真正可移植程序许多模特。
第二个选项是使用#FF端口。它不是一个真正的端口,但是从它读取它会返回ULA当前从屏幕(或255)获取的字节的值。因此,可以在中断上进行同步,然后轮询端口#FF,直到它返回不同于255的值(假设您的屏幕包含不同的内容)。但是,请注意几种常见的Spectrum模型,例如: + 2A和+3,没有这种行为,所以再一次,如果您对支持模型的良好覆盖感兴趣,这不是一个选项。
答案 1 :(得分:0)
地址23672处有一个3字节的帧计数器。
23672 FRAMES
3 byte (least significant first), frame counter. Incremented every 20ms.
我假设这是50Hz中断增加的假设。因此,我将在循环中轮询它,直到最低有效字节发生变化。
答案 2 :(得分:0)
这是很久以前的事了,但我记得有一个内存刷新计数器针对每条扫描线进行了更新。如果在vblank中将其设置为0,则它将包含当前扫描线。