相关影像
快速介绍
世嘉(和他们的电视广告)希望您知道:只有游戏机提供了更快的图形处理和更丰富的声音表现,开发人员才能做出像样的游戏。
他们的新系统包括许多已经被熟知的组件用于编程。 这意味着,理论上开发人员只需要了解一下世嘉的新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位通用寄存器。 请注意,该CPU将该集合分为八个“数据寄存器”(可以进行算术计算)和八个“地址寄存器”(专用于存储内存地址)。
- 不过,这是一大步,考虑到6502和Z80只有8位寄存器。
- 16位ALU:这意味着它需要额外的周期来计算32位数字的算术运算,但在16位/8位数字上表现会很好。
- 外部16位数据总线:如您所见,虽然此CPU具有一些“32位功能”,但它并未被设计为完整的32位机器。 该总线的宽度意味着在移动16位数据时具有更好的性能。
- 有趣的是,摩托罗拉在这款游戏机发布四年前推出了完整的32位CPU68020。 不难想象如果世嘉选择这个芯片的话成本会飙升。
- 24位地址总线:这意味着最多可以访问16 MB的内存。 内存地址在CPU内部仍使用32位值进行编码(只是简单地丢弃了最高字节)。 话虽如此,Mega Drive的总线在物理上是连接到[2]:
- 64 KB的通用RAM。
- 卡带式ROM(最大4 MB)。
- 两个手柄
- 视频显示处理器的寄存器、端口和DMA。
- 主板的寄存器(用于标识这款游戏机)。
- 扩展端口(用于“未来”配件)。
- 第二颗CPU的RAM,通过总线仲裁器进行中介。
- 德州仪器SN76489(一款PSG,充当第二颗声音芯片)。
如果你对为何在能处理32位字的CPU中使用24位地址感到好奇,那是因为那个时代的设备很少需要管理4GB的内存。 考虑到实现未使用的线路在性能和资金方面代价高昂,摩托罗拉做出了一个合理的妥协,采用32位寄存器和24条地址线,为开发者为五年后全面32位CPU(即68020)的到来做好准备。
一种特殊的指令集
在80年代的RISC革命之前,曾有一个浪潮试图巩固指令集的设计方式。 本质上,70年代的消费者CPU(如6502或8080)提供的指令已经预先定义了如何访问内存(这称为“寻址模式”)。 在68000中,摩托罗拉将指令函数(操作码)从寻址模式中分离出来,使后者只是另一个参数(操作数)。 通过这样做,开发人员现在可以使用具有最佳寻址模式的相同操作码(根据他们的需要)。
这一原则被称为指令集正交性,它极大地影响了70年代末的新一代CPU,但随着RISC设计的兴起而迅速消散,实际上将负担转移到了编译器上。 无论如何,摩托罗拉68k系列在80年代非常受欢迎,直到90年代初,很多公司才开始转向另一个供应商。
配角
游戏机中安装了另一个CPU,运行频率约为3.5 MHz的Zilog Z80。 这与之前在Master System文章中分析过的处理器是同一款。
然而,在MD中,Z80主要被指定用于音频控制。 因此,它的16位地址总线由以下[3] 组成:
- 8 KB的RAM。
- 可用的两块声音芯片。
- 一块32KB的动态存储区映射至68000的地址空间,可通过总线仲裁器选择。
- 但实际上,唯一能稳定访问的只有卡带ROM区域[4]。
最后需要强调的是,这两颗CPU能够并行运行……但存在特定限制条件,具体细节将在后续段落中详细说明。
可用内存
主CPU包含64 KB的专用RAM用于存储通用数据,而Z80包含8 KB的RAM用于与声音相关的操作。
相互通信
世嘉选择了两个相互没有感知的独立处理器,那么游戏如何同时管理两者呢? 主程序在68000中执行,这个CPU随后可以在Z80的RAM上写入。 因此,68000可以向Z80的RAM发送一个程序,并指示Z80加载它(通过向Z80发送复位信号)[5]。 一旦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模式[6]。


此外,可以在VDP上设置一个附加参数以堆叠两个图块以形成8x16映射,然后将它们视为单个图块。 因此,垂直解析度加倍。 然而,这将使刷新率减半,因为现在帧是通过隔行渲染的(一帧渲染偶数扫描线,下一帧渲染奇数扫描线,等等),所以它在功能方面更受限制。 索尼克2的多人模式就是这种模式的一个很好的代表[7]。
最后值得一提的是,VDP会自动处理为过扫描区域添加填充,因此游戏开发者不必担心哪些区域是安全的可以用来绘制图形(这与NES的“危险区域”形成对比)。这意味着使用这种视频显示处理器的游戏不需要特别考虑屏幕边缘的安全显示区域,因为这些边缘部分可能会在某些电视上被裁剪掉。VDP自动处理这个问题,使得开发过程更为简化。
硬件组织
在处理图形数据方面,该芯片有两种操作方式:
- 模式IV:行为与其前辈相似的旧模式。
- 这并不意味着此游戏机(MD)可以直接玩SMS游戏,因为需要额外的配件(电源基础转换器(译注:在日本也被称为 Mega 适配器,在欧洲则称为 Master 系统转换器))来玩插在这上面的SMS卡带。 转换器还将指示输入/输出(I/O)芯片将Z80置于控制状态。
- 模式 V:原生操作模式,我们也将专注于此。
模式0到III呢? 好吧,这些属于更旧的SG-1000,而MD不支持它们。
值得一提的是,后来一位该系统的前开发者告诉我,模式V的命令结构(用于在游戏中控制VDP)继承了TMS9918的设计(TMS9918是著名的视频芯片,用于SG-1000中)[8]。 这使得第三方开发者可以更容易地使用模式V,而不必依赖官方文档(以及随之而来的授权费用)。
可用内存

图形内容分布在内存的三个区域[9]:
- 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可以读取它们[10]。 传统上,这只能在特定的时间段内由CPU处理,幸运的是,这台游戏机增加了特殊的电路来将这项任务扔给VDP(我们稍后会详细介绍)。
图块被用来构建总共四个平面,这些平面合并在一起后就形成了屏幕上看到的画面帧。 此外,各个平面上的图块会相互重叠,因此视频显示处理器 (VDP) 会根据平面的类型和图块的优先级值来决定哪个图块会被显示出来。
背景
背景平面,也称为平面B是一个可滚动的图块(一组图块),其中包含静态图块[11]。
这个平面可以有六个不同的尺寸:256x256、256x512、256x1024、512x256、512x512、1024x256。 程序员可以选择更符合其所需滚动类型的维度。
每个图块可以水平和/或垂直翻转,并设置优先级。
在显示的示例中,您会注意到所选的显示区域不是正方形…并不一定是!。 VDP允许为整个帧、每个单独的扫描线或每八个像素设置水平滚动值。 这意味着开发人员可以将选定区域塑造成菱形,并在玩家移动时改变其角度以模拟透视效果。 像这样的技巧不会破坏平面,VDP会获取每条(选定的)水平线并从中构建一个常规帧。
前景


前景平面,也称为平面A [12],具有与背景平面相同的属性,只不过这个平面具有更高的优先级,因此在此平面上渲染的图块将自然地覆盖在背景平面上方。
此外,这个平面允许划分自己以形成一个新的子平面:窗口平面。 唯一的区别是后者不能滚动。
总而言之,你可以看到新的优先级值和单独的平面使游戏设计师能够带来新的场景类型。 此外,通过在每个平面上使用不同的滚动速度,可以实现视差效果。
精灵图
在此平面中,图块被视为精灵图。 它们被放置在一个512x512像素的贴图上,只有其中的一部分(即VDP的输出分辨率)被选中用于显示。 这对于隐藏不需要的精灵图或准备将来展示的其他精灵图很方便。 VDP还提供了一个旧的冲突检测功能。
精灵图通过组合多达4x4的图块(32x32像素贴图)并选择多达16种颜色(包括透明)形成。 如果需要一个更大的精灵图,那么可以将多个精灵图组合成一个。
每个扫描线最多只能有20个精灵图,每个屏幕最多只能有80个精灵图(溢出会破坏整个图层)。
在视频随机存取存储器 (VRAM) 中定义精灵图的区域被称为 精灵图属性表 [13],表中的每一项包含以下内容:图索引 、图层坐标 (x 和 y)、链接值
(用于管理哪些精灵图先被绘制)、优先级(具有最高优先级的精灵图会在重叠时显示在其他精灵图之上)、颜色调色板索引以及垂直和水平翻转信息。
结果


在绘制帧时,系统将根据CRT的光束指向的位置依次调用不同的中断例程。 正如您可能在以前的游戏机中看到的那样,这可以允许CPU处理下一帧(或更改当前帧)。
通常,有两种类型的中断称为:H-Blank(每条水平线)和V-Blank(每帧)。
H-Blank被多次调用,但仅限于执行短例程。 垂直消隐期 允许执行较长的程序例程,但代价是其调用频率仅限于每秒50或60次(具体取决于主机区域版本)。
值得注意的是,示例画面中的过扫描区域左下角出现了随机彩色斑点。 这种现象被普遍称为“CRAM色点”,其成因是CPU在更新CRAM调色板时,恰与VDP绘制剩余扫描线的过程发生冲突(示例中出现在过扫描期间)。 这种冲突导致VDP错误地获取了CPU正在写入的实时数据(而非CRAM中既定位置的数据),从而造成图像异常。 本例中游戏仅在过扫描期更新CRAM,因此在传统CRT显示器上不易察觉。 但在另一关卡中,游戏为模拟水面效果会在帧中段切换调色板, 程序员不得不通过添加闪烁的水波纹进行视觉掩饰[14]。 由此可见,这本质上是在额外色彩表现与CRAM副作用之间寻求平衡的艺术。
专用传输单元
至此我们已探讨了CPU更新画面的机制,但VDP的机制呢? 它又能提供哪些专项功能呢? 事实上,该芯片配备了直接内存访问(DMA)技术,能以更高速度在内存区域间传输数据,且完全无需CPU介入。
DMA可在水平消隐期(H-Blank)、垂直消隐期(V-Blank)或活动显示状态(非中断期间)激活,支持对VRAM、CRAM及VSRAM的写入[15]。 需注意的是,当DMA执行CPU内存传输时会导致CPU总线阻塞,因此合理的调度规划对保障性能至关重要。
精妙运用这些特性可实现高分辨率图像、流畅的视差滚动效果与高帧率表现。 更可能让您的游戏登陆电视广告,带上满屏炫酷的“Blast Processing!”特效标识。
视频输出
该游戏机的初版设计(通常称为”Model 1”)采用了与Master System相同的视频输出接口。 而后续推出的”Model 2”和”Model 3”机型则改用了mini-DIN接口。
音频
可以说,这款游戏机的音频功能设计颇为独特。 一方面,它沿用了上一代主机的成熟音频技术; 另一方面,又在既有技术基础上新增了一种新颖(却复杂)的合成技术。 因此从某种程度来说,它同时兼具两代主机的音频特性。
具体而言,MD搭载了两块声音芯片:一块雅马哈YM2612和一块德州仪器SN76489。
功能
让我们看看每个芯片各自能提供什么,毕竟它们哪个都非常的特别。
雅马哈YM2612
雅马哈YM2612是一款FM合成器[16],提供6个FM通道(其中1个可替换为PCM采样播放)。 该芯片以68000处理器主频的六分之一运行,虽然每次只能输出1个声道,但通过每4个时钟周期轮换1个声道的方式,营造出6声道同时发声的效果[17]。 因此,YM2612的有效采样率约为53kHz。 此外,它支持9位精度的PCM采样[18], 但由于第9位缺乏官方文档支持,商业游戏实际仅使用8位采样。 值得注意的是,其数据总线仅与Z80处理器相连。
频率调制(FM)合成是专业音频合成技术之一,这种在80年代迅速走红的技术开创了全新的音色领域(该时期流行金曲中处处可闻其声)。
简而言之,在极其简化的情况下,FM算法采用单一波形(载波),并使用另一个波形(调制器)来改变其频率。 结果是具有不同声音的新波形。 载波-调制器组合被称为运算符,并且多个运算符可以串联起来形成最终的波形。 不同的组合达到不同的效果。 YM2612 的每个通道可配置四个运算器(operator)。
相较于传统的PSG,这堪称质的飞跃:开发者终于摆脱了预设波形的束缚。
德州仪器SN76489
刺猬索尼克(1991年)。
德州仪器SN76489是一款可编程声音发生器(PSG),可生成三路脉冲波和一路噪声。
这实际上是原始Master System的声音芯片,它嵌入在VDP中。 它以Z80的速度运行。
对PSG的编程只需向单个8位寄存器(称为PSG端口
[19])写入数据,且两颗CPU均可执行此操作。 虽然其数据总线仅与68000相连,但当Z80进行写入时,总线仲裁器会自动无缝处理访问请求。
值得注意的是,本例中”脉冲波3”通道处于闲置状态。 这是因为游戏使用了一种噪声通道模式,该模式保留了第三个脉冲通道用于调制[20],这也是SMS中的一项功能。
混音器
音效. 刺猬索尼克(1991年)。
这两块芯片可同时输出音频信号,此时由一个称为音频混合器的额外组件负责接收两路信号并进行混音处理。
最终生成的模拟信号将通过音频输出接口传输。
执行器
Z80本身是一颗独立的处理器,因此需要运行专用的程序(存储于其8KB RAM中)来解析来自68000或卡带ROM的音乐数据,并有效控制两块音效芯片。 该程序称为音序器或驱动程序。
不过,音频驱动的基础架构并不局限于Z80处理器。 虽然Z80的内存映射表明它是唯一能同时控制两块音频芯片的处理器(这对已经疲于处理其他任务的68000而言或许是一种解脱), 但总线仲裁器仍可暂停Z80以允许68000直接访问YM2612芯片[21]。 这种方案效率较低,但为程序员提供了额外选择。 例如,初代《刺猬索尼克》将音频驱动部署在68000上,而后续作品则将该任务转移至Z80[22]。
破解采样
一些音乐作曲家可能会决定专注于PCM频道以播放更真实的声音,为此,游戏需要使用剩余的可用RAM不断对其音乐进行排序和流式传输。 主要限制是要填充该内存,必须先将主总线阻塞(因此在该时间范围内无法将命令或采样发送到音频芯片)。 否则,可能会出现声音异常(静音、冻结音符、低采样率等)。
出于这个原因,我决定将本节专门举一些成功克服上述限制的游戏例子。 一些游戏并没有仅仅满足于普通的鼓点套件,而是找到了惊人的方式来为单个PCM声道流传输更丰富的采样,看看这些例子:
这是据说由Michael Jackson共同撰写的音轨之一。 无论如何,整体的配乐相比其前辈有着独特的节奏感。
我知道这些声音远达不到CD质量(16位,44.1 kHz),但请记住,这些声音曾经被认为在这台游戏机上是不可能复制出来的,我甚至还没有强调与上一代相比这代表了多少的进步,所以它们至少值得一些赞誉!
辅助FM合成
若说通过雅马哈DX7控制面板编写FM合成器程序已属不易,那么仅用68k/Z80汇编语言创作音乐更是令人头痛至极……
幸运的是,世嘉后来为MS-DOS PC分发了一款名为GEMS的软件,以方便MD音乐[24]的创作(和调试)。 这是一个非常完整的工具,其中包括许多补丁(可供选择的预配置运算符),这也可以解释为什么一些游戏具有非常相似的声音。
更重要的是,这些音频驱动程序还实现了突破硬件限制的通道管理机制:游戏可以实例化超出物理限制的通道数量,并为每个通道分配优先级数值。主机播放音乐时,会根据优先级动态分配这些通道到可用硬件音轨上。 此外,可以自动跳过具有高优先级但没有音乐的频道。
通道还包含一些逻辑,通过在其数据中实现条件,使音乐能够根据玩家在游戏中的进展方式“进化”。
(额外内容)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) [25](实际上是三星SSP1601的重新品牌化版本,这是一款16位数字信号处理器),它可以生成多边形,并随后将它们编码成图块的形式(以便VDP可以读取它们)。 无论如何,只有一款游戏随附,因为SVP的制作成本非常高。
早期联网尝试
在在线服务被广泛采用(和标准化)之前,世嘉尝试了世嘉Meganet,这是一种供游戏使用的拨号服务。 Meganet 要求用户购买一个单独的配件,称为 Sega Mega Modem,然后将其插入游戏机背面(DE-9 连接器所在的位置),最后将其连接到电话线上。 游戏随后会将调制解调器单元视为另一个手柄,并增加与其串行通信的功能 [26](与手柄使用的并行编码相反)。
尽管如此,这一功能只持续了几年,之后世嘉就在后续的修订版中移除了DE-9连接器,并彻底关闭了这项服务。
反盗版/锁区
为了阻止进口游戏,世嘉略微改变了不同地区游戏卡带插槽的形状,但保留了相同的针脚布局。 游戏还可以通过检查版本
寄存器(输出区域值)的值来执行“区域锁定”。
有两个简单的方法可以绕过这个。 一种是通过购买第三方卡带转换器实现。 另一种就是通过改装游戏机并桥接主板上改变版本
寄存器值的引脚。
在软件防盗措施方面,最简单的检查方法是SRAM的大小:盗版卡带的空间通常比实际所需的大很多,因此游戏在启动时会检查预期的SRAM大小。 程序员还可以在游戏的随机点实现额外的校验和检查点,以防黑客删除初始SRAM检查。 唯一的方法是费力地找到所有的检查点,并逐个移除它们……