首先,只有精灵可以显示在边界区域或重复的 8 位模式(8 像素宽)中,该模式是从视频库的最后一个字节(通常为 $3fff)读取的。请注意,当您欺骗 VIC 芯片“不显示”边框时,您只能看到这些精灵或 8 位模式。见下文。
边框比精灵具有更高的优先级,因此通常当在边框区域绘制精灵时,边框会覆盖精灵。通过一些 VIC 芯片技巧,您可以关闭边框。
您可以很容易地关闭顶部和底部边框(我将在下面解释),并且在非常关键的时机关闭侧面边框。
首先介绍一些有关 VIC 芯片如何在 c64 上工作的信息。
VIC芯片从左上到右上绘制屏幕,然后向下一行,再从左到右,直到绘制整个屏幕。它每秒执行重绘 50 次(对于 PAL 设备)或每秒 60 次(对于 NTSC 设备)。
有一个 8 位 VIC 寄存器,其中包含任意给定时间光栅的垂直位置。 $d012。实际上有超过255个可能的位置,因此第9位存储在位7(最高位)或寄存器$d011中。因此,您可以随时读取这些寄存器并找出光栅的垂直位置。没有可用的寄存器来读取光栅的 x 位置。
VIC 芯片的另一个很酷的功能是用来解决使用硬件滚动时的问题。基本的垂直滚动是通过使用硬件寄存器将屏幕垂直移动 0-7 个像素来实现的。一旦达到限制(0 或 7,取决于滚动方向),您将垂直移动每个字符块(8x8 像素)一个块,并绘制要显示在顶部(或底部,取决于方向)的新数据。这非常有效,除了每滚动 8 个像素您就会看到数据“弹出”到屏幕上。为了解决这个问题,您可以通过清除寄存器 $d011 中的位 3 使边界区域垂直增长 8 个像素。这称为 24 行模式。默认情况下,屏幕设置为 25 行 8x8 像素字符。在 24 行模式下,您仍然可以将字符绘制到底行,它们只是被边框隐藏。
因此,关闭顶部和底部边框的技巧是:
1)设置屏幕为25行模式
2) 等待栅格到达 $f2 和 $fa 之间的垂直位置(24 行模式和 25 行模式下边界开始处之间的 8 个像素)。
3) 将屏幕设置为 24 行模式...将边框的垂直起点移动到当前光栅位置上方
4)等到垂直光栅位置($fa)之后
5)重复每一帧
步骤3)欺骗VIC芯片认为它已经开始绘制边界,因此它永远不会开始绘制边界。瞧,顶部和底部边框是开放的。
对于侧边框,您可以使用不同的寄存器执行相同的操作,但由于光栅的水平移动比垂直移动快得多,因此计时需要更严格。还有另一个需要考虑的问题,称为抖动。