跳转到内容

Signetics 2650 & 2636 编程/同步到 VRST

75% developed
来自维基教科书,开放的书籍,开放的世界

到目前为止,我们的程序在很大程度上是静态的——PVI 只被设置过一次,然后就被忽略了。在本教程中,您将学习如何同步到垂直复位信号,并改变屏幕上的内容,以实现每一帧的变化。

什么是 VRST?

[编辑 | 编辑源代码]
另请参阅:控制台硬件 和 模拟电视

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

  • 更改每帧坐标变化的量。


华夏公益教科书