在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行的文字。

Interesting Posts