Signetics 2650 & 2636 编程/同步到 VRST
到目前为止,我们的程序在很大程度上是静态的——PVI 只被设置过一次,然后就被忽略了。在本教程中,您将学习如何同步到垂直复位信号,并改变屏幕上的内容,以实现每一帧的变化。
VRST 是由同步发生器芯片生成的信号。它在视频信号的每 20 毫秒帧中持续约 2.7 毫秒,在这段时间内,CRT 的电子束被关闭,并且正在移动回指向屏幕顶部的点。
此信号连接到微处理器的 Sense 输入,其状态由 PSU 寄存器的第 7 位指示。VRST 的上升沿也设置了 PVI 中寄存器 $1FCB 的第 6 位 (VRLE),尽管这不是一个方便的检查位置。
VRST 具有两点意义。首先,它为我们的程序提供了每 20 毫秒一个规律的时钟滴答,我们可以利用它来确定屏幕上物体移动的速度。其次,PVI 要求我们在 VRST 的下降沿之前设置所有主要对象的垂直坐标。与后者相关的是,我们还需要在扫描期间开始处理其他与更改 PVI 寄存器相关的实时事件,这将在下一章中讨论。
本教程的代码可以在 教程代码 - 同步到 VRST 中找到。
这两个子例程负责检测 VRST 信号的状态
:;================================================================= :; subroutine - wait for VRST to clear :Vsync0: 0058 B480 : tpsu sense 005A 187C : bctr,eq Vsync0 ; wait for Sense bit to clear 005C 17 : retc,un :;================================================================= :; subroutine - wait for VRST to set :Vsync1: 005D B480 : tpsu sense ; wait for Sense bit to be set 005F 1A7C : bctr,lt Vsync1 0061 17 : retc,un :;=================================================================
指令 TPSU 测试程序状态字高字节中的各个位。常量 sense 通过语句 sense equ $80 被等效于值 $80,所以我们正在测试 PSU 的第 7 位,即处理器的 sense 输入,它反过来由 VRST 信号提供。
在子例程 Vsync0 中,程序在 sense 为高时一直循环,或者换句话说,它一直等待 sense 为低。反之,子例程 Vsync1 在 sense 为低时一直循环,或者换句话说,它一直等待 sense 为高。
这是程序的主循环
:endless: 002D 3F0058 : bsta,un Vsync0 ; make sure VRST hasn't started 0030 3F005D : bsta,un Vsync1 ; wait for VRST to start 0033 0C1F0C : loda,r0 vc1 ; increment vertical position of object 1 0036 8401 : addi,r0 1 0038 CC1F0C : stra,r0 vc1 003B 0C1F0A : loda,r0 hc1 ; decrement horizontal position of object 1 003E A401 : subi,r0 1 0040 CC1F0A : stra,r0 hc1 0043 1B68 : bctr,un endless
两个子例程 Vsync0 和 Vsync1 协同工作,实际上是在等待 VRST 信号从低到高的过渡。当这种情况发生时,对象 1 的垂直坐标加 1,其水平坐标减 1。因此,该对象以每 20 毫秒帧一个像素的速度斜向移动,因此每扫描大约需要 5 秒。
不要忘记,垂直坐标必须在 VRST 周期结束之前设置好。这是因为在那个时候,寄存器中的值被传输到一个计数器,该计数器在每条水平线上的值都会递减,直到它达到零,然后显示对象的第 1 行。所以,在 VRST 开始后尽快设置垂直坐标是一个好主意。WinArcadia 调试器允许我们看到这是在哪里发生的
- 打开 blanking 显示:选项 > VDU > Blanking 区域?
- 在 0033 处设置断点:bp $0033
- 打开导向光线:gr
- 逐步执行程序:s
您应该看到,在垂直 blanking 周期的前几条水平线期间,这两个坐标都被设置了。X 和 Y 坐标也显示在 WInArcadia 输出窗口中。
重要的是,这每帧只执行一次,这就是我们同步到 VRST 的过渡的原因。如果没有第一个子例程调用,Vsync0,显示会变得不稳定。尝试将它修补掉,或者通过在该行的开头重新组装代码时添加一个注释, ;bsta,un Vsync0 ,或者通过使用 WinArcadia 内存编辑器将代码替换为 NOP,002D C0 C0 C0。
- 更改每帧坐标变化的量。