今天我们谈论的是ALF。对于 Nicole Express 来说,这是一个令人惊讶的举动;我们不容忍猫吃。但最终阿尔夫也没有。无论如何,我们不是在这里谈论电视节目(我从未见过)或 pogs;我们在这里讨论世嘉主系统的 ALF。按要求!这篇文章是献给我的好朋友 Near 的,他是 Higan 模拟器的作者,我的好朋友,以及教我在这篇文章中使用的调试技术的人,他在一个月前不幸去世了。你应该得到比 ALF 帖子更好的致敬。安息。世嘉大师系统的 ALF 于 1989 年发布,主角是毛茸茸的外星人,试图修理他的太空船。这是一个几乎不错的平台冒险游戏,但是哇,这很难,而且并不总是很好。该游戏具有与 Micronics 相同的“jank”(尽管它实际上是由总部位于旧金山的 Nexa 公司开发的,最终被 Spectrum Holobyte 收购),具有闪烁的字符和笨拙的碰撞检测。这是一个耻辱,因为一个雄心勃勃的头衔;几乎让我想起了ET。无论如何,我们不是在这里谈论世嘉主系统上的 ALF 有多好。我相信一些 80 年代的孩子玩得很开心,这是一个我可以尊重的奇怪头衔。它也是为数不多的仅在北美发行的 Master System 游戏之一。我猜欧洲人就是不喜欢阿尔夫?所以我完全满足于过我的生活而不关心世嘉主系统的 ALF。不过,龚贤在推特上告诉我一个有趣的错误。然后RetroRGB的Bob和天风一起直播,这个问题又出现了,现在我正在写一篇关于ALF的文章。所以我想在这里链接到我的主系统概述,但这还没有完成。所以是时候进入快速模式了。 Sega Mark III 在美国、欧洲和最终在日本被称为 Master System,它的名字来自 Sega SG-1000 控制台的第三次修订。 SG-1000 从未出现在此博客上,但其计算机版本 SC-3000 出现过。
Mark III 与 SG-1000 相比的主要特点在于其图形芯片。 SG-1000 使用 TMS9918A,这是 TI 于 1979 年为其 TI-99/4A 计算机开发的通用芯片,并被 MSX 标准和 ColecoVision 等机器使用。 Mark III 的图形处理器,被称为 VDP(视频显示处理器),看起来不像其他任何东西,它以它为核心,并在它之上构建了一个新系统。所以我不了解您,但这告诉我的是,TMS9918A 在 1979 年的功能非常强大。32 个同时出现的精灵也不容小觑,即使它们是一种颜色并且每个扫描线有 4 个限制。 (但请注意,TI-99/4 和 TI-99/4A 必须与 BASIC 程序之类的东西共享 16kiB 的视频 RAM)这种 TMS9918A 传统还带来了一项功能,该功能一度与硬件精灵同义,但在 1980 年代会变得越来越不常见:硬件碰撞检测。视频游戏中的碰撞检测可能是一个非常复杂的话题,尤其是在资源有限的控制台上。例如,想象一下玩家与敌人的碰撞。我的旧 Javascript 游戏 Aspect Legend 将每个人都视为圆圈;如果你的点在另一个圆的半径内,你就会死。但是,这在 8 位控制台上稍微复杂一些,在那里您无法访问 Math.pow 或现代 CPU 来每 1/60 秒运行一次这些计算。 (或者,在 Aspect Legend 的情况下,每 1/120 秒一次。)所以 Aspect Star “N”采用不同的方法,使用重叠框。 Space Ava 201 是基于网格的,这是一种完全不同的解决问题的方法。 (注意:当我链接到我的代码时,只是因为那是我最熟悉的代码,而不是暗示它是最好的方法)但是请注意,所有这些方法都没有将精灵与碰撞。例如,看看上面。鼠标下方的红框代表碰撞区域;请注意,它包括空白像素,但不包括鼠标的一些脚和身体。与此同时,玩家只是被视为一个点。这在 Aspect Star “N” 中并不是什么大问题,但是如果精灵和碰撞盒变得过于分散,游戏很快就会变得无法玩。硬件冲突检测解决了这个问题,解决了不得不浪费 CPU 周期的问题,只需让视频处理器来做。例如,Atari 8 位系统,包括 2600 和计算机,可以做到这一点。
视频处理器负责绘制精灵,可能使用行缓冲区之类的东西。因此,它需要做的就是当它意识到它在某处绘制一个精灵时设置一个标志。 TMS9918A 正是如此。因此硬件碰撞检测是完美的。它只会在两个精灵实际重叠时报告,而不是在框重叠时报告。非常完美,当精灵“闪烁”时,硬件碰撞检测不会在精灵不可见时记录碰撞;这就是著名的冒险复活节彩蛋成为可能的原因。但是对于 TI 来说,存在一个问题。 TMS9918A 有 32 个精灵。每个都可以与其他 31 个精灵发生碰撞。因此,您不会只需要一个标志:您需要 992。请记住,8 位家用控制台和计算机设计中的几乎所有内容都归结为一个简单的短语:内存很贵。因此,TMS9918A 只是有一个碰撞标志。一旦他们看到这个标志被设置,程序有两个选项:“Race the beam”,在屏幕被绘制时不断检查碰撞标志并检测它何时发生。这比每帧运行一个软件例程需要更多的 CPU 时间。主系统从 TMS9918A 继承了这种单比特硬件冲突检测。这使它有点独特;任天堂娱乐系统,据我所知,雅达利 7800 都避开了这一功能。而主系统上的绝大多数游戏都没有使用它;如果您无论如何都必须进行软件碰撞检测,为什么还要麻烦呢? ALF 的首席程序员凯文·塞盖蒂 (Kevin Seghetti) 只参与了他的第二款主机游戏,而他的第一款游戏是《大富翁》,这并不完全是一款动作游戏。另外,我的意思是,它是世嘉主系统的 ALF。我认为你没有带来 A 级游戏是可以原谅的。
在这里,您可以看到 Alf 被蝙蝠击伤了。不幸的是,阿尔夫非常脆弱,当场死亡。但有些奇怪。阿尔夫在他的精灵和敌人之间没有任何重叠的情况下死去。在大多数游戏中,你只会说碰撞很糟糕。但我只是说硬件碰撞检测是完美的。我们可以通过打开模拟器的源代码,然后在禁用硬件碰撞检测的情况下构建它来确认它应该如何工作。例如,您可以在此处在 Higan 模拟器中执行此操作。没有真正的理由走那么远,但如果你这样做了,你会发现阿尔夫不会死。但是,这个错误有一个有趣的组成部分:我使用 Power Base 转换器在 Genesis 1 上截取了该屏幕截图。这是我拍摄 Master System 屏幕截图的首选方式,因为它具有良好的视频质量。但是,我也有一个日语大师系统。由于日本主系统输出的一些特殊性(据我所知,它的同步处于不同的电压水平),我没有高质量的电缆,而是使用廉价的 SCART 电缆来同步复合视频和给出了一个较暗的图片,带有微弱的 jailbar。所以,日本的Master System 和Mark III 一样的VDP 和初跑的美国Master System;它唯一突出的特点是它使用了 FM 声音。因此,虽然我还没有美国主系统(还),但我认为可以安全地假设它们在这方面是等效的。 Sega Genesis 向后兼容 Master System。但是,它不向后兼容 SG-1000。所有这些 TMS9918A 模式都不可用。这没什么大不了的。西方发行的唯一真正使用 SG-1000 模式的 Master System 游戏是 F-16 Fighting Falcon。 F-16 Fighting Falcon 通常被描述为“基本上是 SG-1000 游戏”,但这并不准确!即使您绕过使用主系统图形模式的标题屏幕,游戏也不会在 SG-1000 上运行(或者至少不会在 SC-3000 上运行)。这是因为它使用了主系统拥有的所有 8kiB RAM。 (相比之下,SG-1000 只有 1kiB 和 SC-3000 2kiB 内置)
F-16 Fighting Falcon其实和ALF有点关系。虽然开发者不是同一个人(事实上,Mobygames 声称 Master System 版本是由著名的世嘉开发商 Yuji Naka 开发的),但这两款游戏都是由 Nexa 开发的。只要确保在真正的主系统上玩你的 Nexa 游戏,显然他们对 Power Base Converter 有一些反对。这基本上意味着世嘉创世纪缺少一些遗留功能。因此,您可能会假设精灵碰撞是这些遗留功能之一;事实上,我注意到如果我修改模拟器以始终检测到硬件碰撞,对象的碰撞箱会更大,这表明软件例程有点马虎。你实际上并不需要一个修改过的模拟器,或者事实上,按下一个按钮来显示 ALF 的软件碰撞检测是多么草率。这是一个让演示运行的未经修改的模拟器。这是最后一帧,在 Alf 和鱼枪潜水员之间检测到碰撞。为什么?左上角注意;一个精灵(鲶鱼)正在与氧吧发生碰撞。由于这是演示,没有播放死亡动画;相反,它会重置回标题屏幕。不!我使用一些Space Ava 201图形制作了一个简单的测试程序,并确认了Master System模式下的Sega Genesis确实支持硬件碰撞。在这种情况下,我只是更改了背景颜色。这实际上是有道理的;这一传统功能也成功地进入了 Mega Drive 模式。 Hugues Johnson 写了一篇描述它的文章,但在测试时要小心,因为即使是 Higan 模拟器也不会为 Mega Drive 游戏实现它。似乎没有商业游戏使用它,而且很容易理解为什么。因此,如果碰撞检测有效,则必须检测到碰撞。让我们来看看犯罪的两个框架。首先是大师系统游戏,阿尔夫不会死。其次,游戏运行在Genesis上,他做的框架。我试图尽可能地匹配它们。有什么不同?屏幕左侧有一只蝙蝠正在生成。我们如何判断蝙蝠在产卵时是否意外造成了碰撞?
跟踪记录器在理论上非常简单。仿真器不断地运行一条又一条指令。在像世嘉主系统这样的系统上,用一个 CPU 控制一切,游戏状态可以在每条指令后记录下来。这可以让您逐步通过状态。在实践中,有一个问题,就是指令很多。 Sega Master System CPU 时钟运行在 3.5MHz。考虑到它有 8kiB 的 RAM 和 16kiB 的 VRAM,记录所有内容的恒定状态将占用大量磁盘空间。因此,相反,每条指令都只有这样一行:这可能看起来令人生畏!但也不算太糟。首先是正在读取的地址。然后,在那个地址有指令。 AF、BC、DE、HL、IX、IY、SP、IFF 和 IM 是 Z80 处理器内部寄存器的状态。那么,为什么我选择了位 5,a 指令?这是因为我正在寻找碰撞检测的检查。如果我们查看 SMS Power 的 Master System VDP 文档,我们会看到它是从控制端口读取时的第五位。因此,将使用检查 a 字节内的位的位指令的想法只是一个有根据的猜测。我们如何确认这是正确的地方?让我们通过查看此指令之前的指令来了解 a 的来源。所以 a 来自地址 $c009。这是在 Sega Master System 的 RAM 空间中。我们继续向后工作;最后一个触及 $c009 的代码在哪里?简单的向后搜索会告诉我们。 0074 a,($bf) AF:1010 BC:0006 DE:cfac HL:cfb9 IX:ba18 IY:c02d SP:dfec IFF:00 IM:10076 ld ($c009),a AF:8010 BC:0006 DE: cfac HL:cfb9 IX:ba18 IY:c02d SP:dfec IFF:00 IM:1
a,($bf) 使用主系统的 IO 端口;这些是 Z80 的一个方便的特性,与我更熟悉的基于 6502 的系统不同,您不需要让 IO 伪装成 RAM 并占用可用内存映射中的空间。而上面的 SMS Power 文章指出,$3f 正是 VDP 寄存器的来源。所以跟踪的一个大问题是即使很短的时间也会产生大量的指令。我去了有问题的洞穴,跑了足够长的时间让一只蝙蝠产卵,小心不要看到两个物体发生碰撞。这只是几秒钟;创建的日志是 70MB。这就是为什么我们需要能够知道要查找的内容。在这种情况下,我可以查看第 0097 行的第 5 位,然后查看接下来的几行,看看它对检查做了什么。 0097 bit 5,a AF:8053 BC:00be DE:7f80 HL:d135 IX:ba18 IY:c02d SP:dfec IFF:00 IM:10099 call nz,$377e AF:8055 BC:00be DE:7f135 IX HL: :ba18 IY:c02d SP:dfec IFF:00 IM:1009c call $083c AF:8055 BC:00be DE:7f80 HL:d135 IX:ba18 IY:c02d SP:dfec IFF:00 IM:1 call nz,$377e仅当清除零标志时才以 $377e 调用例程,这通常意味着前一条指令具有非零结果。因此,只有在检测到碰撞时才会进行跳转。由于下一行是 $009c 处的指令,我们可以意识到分支没有被采用。由于我的跟踪没有可见的对象碰撞,您会期望它不会出现采用该分支的情况。但事实并非如此。稍后,我们看到:0097 bit 5,a AF:e053 BC:00be DE:7f80 HL:d135 IX:85ed IY:c02d SP:dfec IFF:00 IM:10099 call nz,$377e AF:e031 BC:00be DE:7f80 HL:d135 IX:85ed IY:c02d SP:dfec IFF:00 IM:1377e ld a,($c254) AF:e031 BC:00be DE:7f80 HL:d135 IX:85ed IY:c02d SP:dfea :00 即时消息:1
所以碰撞确实发生了!只有两帧(这段代码每帧运行一次;我能够将它追溯到帧中断处理程序,所以每 60Hz 一次)。您希望真正的碰撞持续超过两帧。 (当然,我通过更多的日志记录证实了这一点)这是一个更难回答的问题。我要说的是,ALF 非常注重时间。它总是在主线程上运行代码,而中断运行。事实上,我尝试使用 SMS 检查来通读代码,虽然它没有完全工作(遗憾的是它无法捕获主要的游戏逻辑,但它确实用它的位 5,a 捕获了我们的中断处理程序) ,它确实表明游戏仅在日本系统上经历了长时间的延迟循环。鉴于这款游戏甚至还没有在美国以外地区发布,人们不得不怀疑这一点,但这绝对意味着时机至关重要。如果您使用像 MEKA 这样的模拟器,您可以在 PAL 和 NTSC 计时之间切换,这比 Genesis 和 Master System 之间的差异要大得多。并且介绍演示的敌人位置差异很大!考虑上面的海底截图;在主系统上,阿尔夫被长矛手杀死。在这里,阿尔夫被长矛杀死,而不是被长矛手杀死。 (另外,猫还没有与物体发生碰撞。)我没有 PAL 主系统来检查这个。当然,在现实世界中,ALF 只在美国发行。有故障的视频游戏一点也不奇怪。但是看到即使是相对细微的差异也能被注意到,以及事件链是如何有趣的。经历了这一切之后,很难责怪 Nexa 的任何人没有注意到这一点。我的意思是,Genesis 甚至还没有在美国推出,更不用说 Power Base Converter。另外,我的意思是,它是 ALF。为什么我花了这么长时间?