首先,只有精灵可以显示在边界区域或从视频库的最后一个字节读取的重复的 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 芯片认为它已经开始绘制边界,因此它永远不会开始绘制它。瞧,顶部和底部边界是开放的。
关于边边界,您可以使用不同的寄存器做同样的事情,但是由于光栅的水平移动比垂直移动快很多,所以时间需要更紧。还有另一个问题需要考虑,称为抖动。<-我不会在这里解释。在 Web 上搜索“Stable Raster C64”以获得对该问题的深入解释。