相关影像
快速介绍
世嘉(和他们的电视广告)希望您知道:只有游戏机提供了更快的图形处理和更丰富的声音表现,开发人员才能做出像样的游戏。
他们的新系统包括许多已经被熟知的组件用于编程。 这意味着,理论上开发人员只需要了解一下世嘉的新GPU……对吧?
中央处理器 (CPU)
该游戏机有两个通用处理器。
主处理器
首先,我们有一个摩托罗拉68000运行在~7.6MHz,这是一种流行的处理器,当时已经出现在许多计算机中,例如Amiga、(初版)Macintosh、Atari ST… 有趣的是,这些计算机每一代都继承了它们的“6502前辈”,而虽然Sega Master System(译注:以下简称SMS)(MD的前身)并未采用6502 CPU,但NES(译注:即美版FC,日版也是同样CPU)却使用了(在某种程度上,世嘉的目标是要吸引任天堂的消费者)。 总而言之,你可以看到电脑的发展和游戏机技术之间是有一点关联的。
回到主题,68k具有“主”CPU的角色,它将负责游戏逻辑,处理I/O和图形计算。 它具有以下功能[1]:
- 68000 ISA:具有大量功能的新指令集,包括一组乘法和除法操作码。 一些指令是8位长(称为“字节”)的,其他指令则是16位长(称为“字”),剩下的指令是32位长(称为“长字”)。
- 八个通用32位寄存器:这可是一大步,考虑到6502和Z80只有8位寄存器。
- 16位ALU:这意味着它需要额外的周期来计算32位数字的算术运算,但在16位/8位数字上表现会很好。
- 外部16位数据总线:如您所见,虽然此CPU具有一些“32位功能”,但它并未被设计为完整的32位机器。 该总线的宽度意味着在移动16位数据时具有更好的性能。
- 有趣的是,摩托罗拉在这款游戏机发布四年前推出了完整的32位CPU68020。 不难想象如果世嘉选择这个芯片的话成本会飙升。
- 24位地址总线:这意味着最多可以访问16 MB的内存。 内存地址在CPU内部仍使用32位值进行编码(只是简单地丢弃了最高字节)。 话虽如此,总线在物理上是可以连接的到的[2]:
- 64 KB的通用RAM。
- 卡带式ROM(最大4 MB)。
- 两个手柄
- 视频显示处理器的寄存器、端口和DMA。
- 主板的寄存器(用于标识这款游戏机)。
- 扩展端口(用于“未来”配件)。
- 第二个CPU的RAM,由总线仲裁器中介。
如果你对为何在能处理32位字的CPU中使用24位地址感到好奇,那是因为那个时代的设备很少需要管理4GB的内存。 结合实际情况来看,实现未使用的地址线在性能和成本上都是昂贵的,因此摩托罗拉做出了一个合理的妥协(24条地址线),这也能让开发者为将来全面32位CPU(即68020)的到来做好准备。
一种特殊的指令集
在80年代的RISC革命之前,曾有一个浪潮试图巩固指令集的设计方式。 本质上,70年代的消费者CPU(如6502或8080)提供的指令已经预先定义了如何访问内存(这称为“寻址模式”)。 在68000中,摩托罗拉将指令函数(操作码)从寻址模式中分离出来,使后者只是另一个参数(操作数)。 通过这样做,开发人员现在可以使用具有最佳寻址模式的相同操作码(根据他们的需要)。
这一原则被称为指令集正交性,它极大地影响了70年代末的新一代CPU,但随着RISC设计的兴起而迅速消散,实际上将负担转移到了编译器上。 无论如何,摩托罗拉68k系列在80年代非常受欢迎,直到90年代初,很多公司才开始转向另一个供应商。
副CPU(译注:原文是The second banana,直译的话,应该是次要角色之类的)
游戏机中安装了另一个CPU,运行频率约为3.5 MHz的Zilog Z80。 这与之前在Master System的文章中分析的处理器相同。
Z80主要用于声音控制。 因此,它的16位地址总线由以下[3] 组成:
- 8 KB的RAM。
- 两个声音芯片。
- 68000的RAM(同样,由总线仲裁器处理)。
最后,重要的是要注意两个CPU是并行运行的。
可用内存
主CPU包含64 KB的专用RAM用于存储通用数据,而Z80包含8 KB的RAM用于与声音相关的操作。
相互通信
世嘉选择了两个相互没有感知的独立处理器,那么游戏如何同时管理两者呢? 主程序在68000中执行,这个CPU随后可以在Z80的RAM上写入。 因此,68000可以向Z80的RAM发送一个程序,并指示Z80加载它(通过向Z80发送复位信号)[4]。 一旦Z80得到控制,它就可以用来管理声音子系统,并使用前面描述的方法移动内存,所有这些都是在68000处理其他操作的同时进行的。
因为一个CPU需要介入另一个CPU的总线,并且两者不能同时使用总线,所以必须激活一个额外的组件叫做总线仲裁器来暂停任一处理器,以便能够无风险地写入内存。
重要的是要指出,如果管理不当,这种设计可能会表现不佳,因此游戏必须特别注意总线仲裁器,并确保不要让任一CPU被暂停的时间超过必要。
图形
答案就是_爆炸处理!_,你还想知道什么?
好吧,如果你想了解_真实的_答案:图形数据由68000处理器处理,并在一个专有的芯片上渲染,这个芯片称为视频显示处理器(简称“VDP”),然后VDP将生成的画面(以扫描线的形式)发送出去进行显示。
VDP以约13 MHz运行,并根据区域支持多种分辨率模式:在NTSC中最高320x224像素,在PAL中最高320x240像素。
在多个显示分辨率的背后
从技术上讲,VDP每个扫描线可以容纳40或32列图块,图块行数取决于区域(NTSC中的28或PAL中的30)。 虽然,大多数PAL游戏并不关心PAL系统中允许的额外图块(因为它们可能需要保持两个区域之间的一致性,NTSC是共同点),所以它们指示VDP渲染28行(就像它们在NTSC系统中所做的那样)。 因此,VDP别无选择,只能用背景色填充未使用的区域(在过扫描期间也使用)。
您可以通过检查具有调试功能的模拟器中的Mode Set Register#2
来查看哪些PAL游戏在NTSC模式下渲染(即: Exodus). 如果从右数第四位是0
,则VDP运行在NTSC模式[5]。
此外,可以在VDP上设置一个附加参数以堆叠两个图块以形成8x16映射,然后将它们视为单个图块。 因此,垂直解析度加倍。 然而,这将使刷新率减半,因为现在帧是通过隔行渲染的(一帧渲染偶数扫描线,下一帧渲染奇数扫描线,等等),所以它在功能方面更受限制。 索尼克2的多人模式就是这种模式的一个很好的代表[6]。
最后值得一提的是,VDP会自动处理为过扫描区域添加填充,因此游戏开发者不必担心哪些区域是安全的可以用来绘制图形(这与NES的“危险区域”形成对比)。这意味着使用这种视频显示处理器的游戏不需要特别考虑屏幕边缘的安全显示区域,因为这些边缘部分可能会在某些电视上被裁剪掉。VDP自动处理这个问题,使得开发过程更为简化。
硬件组织
在处理图形数据方面,该芯片有两种操作方式:
- 模式IV:行为与其前辈相似的旧模式。
- 这并不意味着此游戏机(MD)可以直接玩SMS游戏,因为需要额外的配件(电源基础转换器(译注:在日本也被称为 Mega 适配器,在欧洲则称为 Master 系统转换器))来玩插在这上面的SMS卡带。 转换器还将指示输入/输出(I/O)芯片将Z80置于控制状态。
- 模式 V:原生操作模式,我们也将专注于此。
模式0到III呢? 好吧,这些属于更旧的SG-1000,而MD不支持它们。
值得一提的是,后来一位该系统的前开发者告诉我,模式V的命令结构(用于在游戏中控制VDP)继承了TMS9918的设计(TMS9918是著名的视频芯片,用于SG-1000中)[7]。 这使得第三方开发者可以更容易地使用模式V,而不必依赖官方文档(以及随之而来的授权费用)。
可用内存
图形内容分布在内存的三个区域[8]:
- 64 KBVRAM(视频RAM):包含大部分图形数据。
- 80 BVSRAM(垂直滚动RAM):VDP支持垂直和水平滚动,出于某种原因,V滚动值存储在这个单独的空间中。
- 128 BCRAM(颜色RAM):存储四个调色板条目,每个条目有16种颜色(包括
透明
),系统提供512种颜色用于选择。 此外,高光和阴影效果可以应用于每个调色板,以实现每个调色板更广泛的颜色范围。
构造帧
以下部分解释了VDP如何渲染每一帧画面,为了演示的目的,刺猬索尼克将被用作例子。 在开始之前,我建议检查一下它的前辈的_modus operandi(工作方式)_,因为这里会有很多回顾的内容。
图块
就像任天堂的PPU一样,VDP是一个基于图块的引擎,因此它使用图块(基本8x8位图)来组成图形平面。 对于VDP而言,每个图块都通过一个4字节长的数组进行编码,其中每个4位的条目对应一个像素,其值对应一个颜色条目(指向颜色调色板)。
游戏卡带将图块存储在其ROM(在其卡带中找到)中,但必须将它们复制到VRAM以便VDP可以读取它们[9]。 传统上,这只能在特定的时间段内由CPU处理,幸运的是,这台游戏机增加了特殊的电路来将这项任务扔给VDP(我们稍后会详细介绍)。
图块被用来构建总共四个平面,这些平面合并在一起后就形成了屏幕上看到的画面帧。 此外,各个平面上的图块会相互重叠,因此视频显示处理器 (VDP) 会根据平面的类型和图块的优先级值来决定哪个图块会被显示出来。
背景
背景平面,也称为平面B是一个可滚动的图块(一组图块),其中包含静态图块[10]。
这个平面可以有六个不同的尺寸:256x256、256x512、256x1024、512x256、512x512、1024x256。 程序员可以选择更符合其所需滚动类型的维度。
每个图块可以水平和/或垂直翻转,并设置优先级。
在显示的示例中,您会注意到所选的显示区域不是正方形…并不一定是!。 VDP允许为整个帧、每个单独的扫描线或每八个像素设置水平滚动值。 这意味着开发人员可以将选定区域塑造成菱形,并在玩家移动时改变其角度以模拟透视效果。 像这样的技巧不会破坏平面,VDP会获取每条(选定的)水平线并从中构建一个常规帧。
前景
前景平面,也称为平面A [11],具有与背景平面相同的属性,只不过这个平面具有更高的优先级,因此在此平面上渲染的图块将自然地覆盖在背景平面上方。
此外,这个平面允许划分自己以形成一个新的子平面:窗口平面。 唯一的区别是后者不能滚动。
总而言之,你可以看到新的优先级值和单独的平面使游戏设计师能够带来新的场景类型。 此外,通过在每个平面上使用不同的滚动速度,可以实现视差效果。
精灵图
在此平面中,图块被视为精灵图。 它们被放置在一个512x512像素的贴图上,只有其中的一部分(即VDP的输出分辨率)被选中用于显示。 这对于隐藏不需要的精灵图或准备将来展示的其他精灵图很方便。 VDP还提供了一个旧的冲突检测功能。
精灵图通过组合多达4x4的图块(32x32像素贴图)并选择多达16种颜色(包括透明)形成。 如果需要一个更大的精灵图,那么可以将多个精灵图组合成一个。
每个扫描线最多只能有20个精灵图,每个屏幕最多只能有80个精灵图(溢出会破坏整个图层)。
在视频随机存取存储器 (VRAM) 中定义精灵图的区域被称为 精灵图属性表 [12],表中的每一项包含以下内容:图索引 、图层坐标 (x 和 y)、链接值
(用于管理哪些精灵图先被绘制)、优先级(具有最高优先级的精灵图会在重叠时显示在其他精灵图之上)、颜色调色板索引以及垂直和水平翻转信息。
结果
在绘制帧时,系统将根据CRT的光束指向的位置依次调用不同的中断例程。 正如您可能在以前的游戏机中看到的那样,这可以允许CPU处理下一帧(或更改当前帧)。
通常,有两种类型的中断称为:H-Blank(每条水平线)和V-Blank(每帧)。
H-Blank被多次调用,但仅限于执行短例程。 此外,只有CRAM和VSRAM可访问,因此游戏只能更新其调色板或垂直滚动其平面。
V-Blank允许更长的例程,缺点是每秒只能调用50或60次(取决于游戏机的区域),但它能够访问所有内存位置。
请注意,示例中的过扫描区域在右下角显示了一些随机的彩色点。 这通常被称为CRAM点,发生的情况是CPU正在更新CRAM中的调色板,同时VDP正在发送剩余的扫描线(在示例中,这发生在过扫描期间)。 这种冲突会使VDP获取CPU当时正在写入的任何值(而不是CRAM中所需的位置),从而破坏图像显示。 然而,由于在这种情况下,游戏只在过扫描时更新CRAM,这种异常在传统CRT上没有被注意到。 其他游戏试图更新调色板中帧以实现更多颜色,代价是必须平衡CRAM点的外观。
专用传输单元
到目前为止,我们已经讨论了CPU可以做什么来更新帧,但是VDP呢? 它是否能提供更专业的东西? 是的,该芯片具有直接内存访问(简称“DMA”),允许以更快的速度和在内存位置之间移动数据,而无需CPU的干预。
DMA可以在H-Blank、V-Blank或活动状态(在任何中断之外)期间激活,并可用于通过VRAM、CRAM和/或VSRAM[13] 进行写入。 此外,在使用DMA传输CPU RAM期间,CPU总线将被阻塞,因此良好的规划对于实现性能至关重要。
这些特征的特殊使用可以提供高分辨率图形、流畅的视差滚动和高帧速率。 此外,你的游戏还可能会出现在电视广告中,并且到处都是标有大量 爆炸处理! 的标志。
视频输出
该游戏机的第一个设计(通常称为“型号1”)具有与SMS相同的视频输出端口。 随后的“模型2”和“模型3”切换到迷你DIN端口。
音频
至少可以说,这个游戏机的音频功能有点非主流。 一方面,MD提供了上一代的现有音频技术,另一方面,它又在现有技术的基础上添加了一种新的(但复杂的)合成技术。 所以,在某些方面,你实际上等于拥有了这两代主机的音频技术。
话虽如此,MD包含两个声音芯片:雅马哈 YM2612和德州仪器SN76489。
功能
现在让我们看看每个芯片提供什么,毕竟每个芯片都 非常不同。
雅马哈YM2612
雅马哈 YM2612是一款FM合成器[14],以68000速度运行并提供六个FM频道,其中一个可以播放PCM采样(具有8位分辨率和32 kHz采样率)。
频率调制或‘FM’合成是用于声音合成的专业技术之一,它在80年代显著流行起来,并开辟了全新的声音领域(许多这样的声音你可以在那个时代的流行音乐中听到)。
简而言之,在极其简化的情况下,FM算法采用单一波形(载波),并使用另一个波形(调制器)来改变其频率。 结果是具有不同声音的新波形。 载波-调制器组合被称为运算符,并且多个运算符可以串联起来形成最终的波形。 不同的组合达到不同的效果。 这个芯片允许每个通道使用4个运算符。
与传统的PSG合成器相比,这是一个巨大的改进:您不再被预定义的波形所困。
德州仪器SN76489
刺猬索尼克(1991年)。
德州仪器SN76489是一款PSG芯片,可产生三个脉冲波和一个噪声。
这实际上是原始Master System的声音芯片,它嵌入在VDP中。 它以Z80的速度运行。
请注意,“脉冲3(Pulse 3)”通道仍未使用。 这是因为游戏使用了一种噪声通道模式,该模式保留了第三个脉冲通道用于调制[15],这也是SMS中的一项功能。
混音器
音效. 刺猬索尼克(1991年)。
两个芯片可以同时输出声音,然后一个名为“音频混合器”的额外组件负责接收两个信号并混合它们。
最后,生成的模拟信号通过音频输出发送。
执行器
理论上,Z80的内存映射表明Z80是唯一能够指挥这两个芯片的CPU(这可能会减轻68000的负担,因为后者已经喂满了其他任务)。 然而,在实际情况中,Z80可以关闭,因此68000可以访问YM2612(但不能访问SN76489)[16]。 因此,为了简单起见,在本文中,我们将假设音频任务被指定为Z80。
继续讲下去,Z80是一个独立的处理器,因此它需要自己的程序(存储在可用的8 KB RAM中),以便能够解析从68000接收的音乐数据,并据此有效地操控两个音效芯片。 该程序称为音序器或驱动程序。
破解采样
一些音乐作曲家可能会决定专注于PCM频道以播放更真实的声音,为此,游戏需要使用剩余的可用RAM不断对其音乐进行排序和流式传输。 主要限制是要填充该内存,必须先将主总线阻塞(因此在该时间范围内无法将命令或采样发送到音频芯片)。 否则,可能会出现声音异常(静音、冻结音符、低采样率等)。
出于这个原因,我决定将本节专门举一些成功克服上述限制的游戏例子。 一些游戏并没有仅仅满足于普通的鼓点套件,而是找到了惊人的方式来为单个PCM声道流传输更丰富的采样,看看这些例子:
这是据说由Michael Jackson共同撰写的音轨之一。 无论如何,整体的配乐相比其前辈有着独特的节奏感。
我知道这些声音远达不到CD质量(16位,44.1 kHz),但请记住,这些声音曾经被认为在这台游戏机上是不可能复制出来的,我甚至还没有强调与上一代相比这代表了多少的进步,所以它们至少值得一些赞誉!
辅助FM合成
如果使用雅马哈 DX7的控制面板编程FM合成器已经被认为是复杂的,那么想象一下仅用68k汇编语言来创作音乐所带来的头痛问题……
幸运的是,世嘉后来为MS-DOS PC分发了一款名为GEMS的软件,以方便MD音乐[18]的创作(和调试)。 这是一个非常完整的工具,其中包括许多补丁(可供选择的预配置运算符),这也可以解释为什么一些游戏具有非常相似的声音。
此外,音频子系统使游戏能够实例化比允许数量更多的通道,并为每个通道分配一个优先级值,然后当游戏机播放音乐时,它会根据优先级动态地将音乐通道分配到可用的槽位中。 此外,可以自动跳过具有高优先级但没有音乐的频道。
通道还包含一些逻辑,通过在其数据中实现条件,使音乐能够根据玩家在游戏中的进展方式“进化”。
(额外内容)Mega CD声效
这里有一个有趣的事实:Mega CD扩展设备提供了额外的2个通道用于CD音频(还有其他功能)。 其中一个最著名的游戏《刺猬索尼克CD》拥有非常出色的音乐质量,但和其他游戏一样,音乐也需要循环播放。问题在于,在1倍速的CD读取器上循环播放音乐会导致明显的间隙,因此游戏包含了循环填补音轨,这些音轨在CD头返回起点的同时由另一个PCM芯片执行。
这些填补音轨仅出现在游戏早期测试版本中,并没有被包含在最终发行版中;直到2011年的重制版才最终加入了这些填补音轨。 这是游戏的其中一关:
你注意到Mega CD版本的差异了吗?
游戏
游戏主要是用68000汇编编写的,而声音驱动是用Z80汇编实现的。 两者都驻留在卡带ROM中,最大可达4 MB,而无需映射器。
额外功能
就可扩展性而言,这种设计不像NES或SNES那样模块化。 因此,后来像32x这样的附加组件(包括接管68k的新芯片组)不得不绕过VDP(因此需要“连接器电缆”)。
仅有一款定制芯片被用于卡带,那就是世嘉虚拟处理器 (Sega Virtua Processor) [19](实际上是三星SSP1601的重新品牌化版本,这是一款16位数字信号处理器),它可以生成多边形,并随后将它们编码成图块的形式(以便VDP可以读取它们)。 无论如何,只有一款游戏随附,因为SVP的制作成本非常高。
早期联网尝试
在在线服务被广泛采用(和标准化)之前,世嘉尝试了世嘉Meganet,这是一种供游戏使用的拨号服务。 Meganet 要求用户购买一个单独的配件,称为 Sega Mega Modem,然后将其插入游戏机背面(DE-9 连接器所在的位置),最后将其连接到电话线上。 游戏随后会将调制解调器单元视为另一个手柄,并增加与其串行通信的功能 [20](与手柄使用的并行编码相反)。
尽管如此,这一功能只持续了几年,之后世嘉就在后续的修订版中移除了DE-9连接器,并彻底关闭了这项服务。
反盗版/锁区
为了阻止进口游戏,世嘉略微改变了不同地区游戏卡带插槽的形状,但保留了相同的针脚布局。 游戏还可以通过检查版本
寄存器(输出区域值)的值来执行“区域锁定”。
有两个简单的方法可以绕过这个。 一种是通过购买第三方卡带转换器实现。 另一种就是通过改装游戏机并桥接主板上改变版本
寄存器值的引脚。
在软件防盗措施方面,最简单的检查方法是SRAM的大小:盗版卡带的空间通常比实际所需的大很多,因此游戏在启动时会检查预期的SRAM大小。 程序员还可以在游戏的随机点实现额外的校验和检查点,以防黑客删除初始SRAM检查。 唯一的方法是费力地找到所有的检查点,并逐个移除它们……