在Commodore 64的屏幕边框绘制
好。 我希望它不会因为我25年来的好奇而closures,我很想理解这个诀窍。
6569维也纳国际中心无法处理边界问题。 你所能做的只是在光标所在的中心区域绘制像素。 边界总是统一的,虽然你可以改变它的颜色捅53280,颜色,如果我没有记错的话。
尽pipe如此,我清楚地记得游戏介绍了边框以graphics为特色,就像完全可以解决的一样。 我试图理解它是如何工作,但从来没有到位。 传说说这是巧妙的使用精灵,在某些情况下,可能会被画在边界上,但我不知道这是否是一个城市的传说。
编辑 :只需从提供的链接之一阅读
精灵在垂直栅格线上复用(超过8个精灵,有时达到120个精灵)。 直到2007年5月群锐公司发布Krestage 3之前,人们普遍认为在一条光栅线上不能出现超过8个的精灵,但是指定新的Y坐标使得它在屏幕上再次出现。
这是邪恶的….你打败光栅,重新定位精灵之前,它到达那里…
首先,只能在边界区域显示精灵,或者从video库的最后一个字节(通常是$ 3fff)读取重复的8位图案(8个像素宽)。 请注意,只有当您将VIC芯片设置为“不显示”边框时,才能看到这些精灵或8位图案。 见下文。
边界的优先级高于精灵,因此通常当边界区域中绘制精灵时,边界将覆盖精灵。 有点VIC芯片的诡计,你可以closures边界。
您可以很容易地closures顶部和底部的边框(我将在下面解释),并且侧面closures的时间非常关键。
首先是关于VIC芯片如何在c64上工作的一些信息。
VIC芯片从左上angular到右上angular绘制屏幕,然后再下一行,再从左到右绘制整个屏幕。 它每秒执行50次(对于PAL单元)或对于(NTSC单元)每秒执行60次。
有一个8位VIC寄存器,包含任何给定时间的光栅的垂直位置。 $ D012。 实际上有255个可能的位置,所以第9位存储在第7位(最高位)或寄存器$ d011。 所以在任何时候你都可以读取这些寄存器并找出栅格的垂直位置。 没有可用的寄存器来读取栅格的x位置。
VIC芯片另一个很酷的function是用来解决使用硬件滚动时遇到的问题。 基本垂直滚动是通过使用硬件寄存器垂直移动屏幕0-7像素来实现的。 一旦达到极限(取决于滚动方向的0或7),您将每个字符块(8×8像素)垂直移动一个块,并绘制新数据显示在顶部(或底部依赖方向)。 这工作得很好,除了每8个像素的滚动,你会看到数据“popup”到屏幕上。 为了解决这个问题,可以通过清除寄存器$ d011中的位3来使边界区域垂直增长8个像素。 这被称为24行模式。 默认情况下,屏幕被设置为25行8×8像素字符。 在24行模式下,您仍然可以在底行绘制字符,只会被边框隐藏。
所以closures顶部和底部边界的技巧是:
1)将屏幕设置为25行模式
2)等待栅格达到$ f2和$ fa之间的垂直位置(在24行模式和25行模式中的边界开始之间的8个像素)。
3)将屏幕设置为24行模式…将当前光栅位置上的边界的垂直起点移动
4)等到垂直光栅位置($ fa)
5)重复每一帧
步骤3)欺骗VIC芯片,认为它已经开始绘制边界,所以它永远不会开始绘制它。 瞧,顶部和底部边界是开放的。
关于边框,你可以用不同的寄存器做同样的事情,但是由于光栅的水平移动要快得多,所以垂直移动的时间需要更加紧密。 还有一个问题要考虑到抖动。 <我在这里不会解释 在网站上search“稳定栅格C64”,以深入解释该问题。
请注意,Krestage 3做了什么(正如问题中提到的)是不同的。
诀窍的一个层面是当“纸张”(工作区域矩形,边界内的东西)的底部刚被绘制时混淆边界。 这可以让你在上下边界有精灵。
更高的层次是在纸张的右边缘,在每一条栅格线上都要搞砸,正如JohnD在上面的回答中所解释的那样。 这可以让你在左边界和右边界有精灵。
这一切都不会让你在一行中有超过8个精灵。 这只是Krest的魔法。
到目前为止,VIC芯片最好的资源是“MOS 6567/6569video控制器(VIC-II)及其在Commodore 64”中的应用,并且一个有用的附录是“The memory access of the MOS 6559 VIC-II和MOS 8566 VIC-IIevideo接口控制器“由MarkoMäkelä提供。
注意:这些都有些技术性,你可能会发现它们更容易理解,因为你自己编写了一些VIC效果。
如果这些链接永远消失了,那么只需要按照标题来search文章,就可以无限复制。
你可以用一个简单的BASIC程序打开上下边界:
1 poke56334,0:poke53266,212:poke53265,27:poke16383,0 2 h = 53265:i = 53273:h1 = 19:h2 = 27:i1 = 1 3 pokei,i1:waiti,i1:pokeh,h1:pokeh,h2:goto3
我要在黑暗中刺(这个我自己没做过)。 我在维基百科find了这个。
c64demo部分解释说:
效果认为不可能在演示中实现,主要是由于与MOS技术VIC-II芯片有关的无证副作用。 VIC-欺骗的一些例子:
其中一个提到的黑客是:
雪碧卷轴被放置在边界。 通过欺骗硬件不要在屏幕上绘制边框,可以将精灵移动到该区域并显示。
当然,问题的有趣部分是如何完成的。 我会build议看一些演示数据库 ,其中包括源代码search演示,使用黑客。
打印“它是53280,DUDE”。
据我所知,这只有在精灵才有可能。
精灵被允许在边界地区,边界被拉得过高。 通过一些欺骗,边界可以被删除。
使用精灵摆脱边界确实有一个窍门。 我最近在一些关于4K演示或者其他文章的文章中看到了它。 维基百科引用它,这可能足以让你在轨道上find如何做到这一点。
IIRC,精灵是你这样做的方式。 一点看起来可能会出现至less一个网站的细节。
边框中的graphics:要么是精灵,要么是使用$ 3FFF效果(实际上根本不是精灵)。 详细介绍需要更多的空间和时间比我在这里可用。
你也可以在基本的边界中获得精灵: 基本精灵在边界
iirc,还有一些混淆video芯片的方法,那就是画第26行的文字。