PC Engine / TurboGrafx-16 架构

Rodrigo Copetti 的实用分析

译者:Carryspider

这是原文的志愿翻译。如果您发现任何错误,请帮助改进。谢谢!

如果您使用无障碍阅读工具、电子书或旧版浏览器,切换到“经典”版




相关影像

型号

Image
PC Engine。
1987年10月30日于日本发布。
Image
TurboGrafx-16.
1989年8月29日于美国,1989年11月22日于法国,1990年于英国和西班牙发布。

主板

Image
主板
TurboGrafx的主板展示。
PC Engine的主板要更小,是堆叠结构的。
Image
带有重要部件标签的主板

图示

Image
主架构图
看起来挺简单,对吧?

快速入门

Hudson和NEC联手启动了这台第四代游戏机。 不幸的是,由于竞争,他们再多的努力,最终也失色黯然。 尽管如此,他们的这台游戏机作为市场上最紧凑的设计之一,依然保持在顶流。


型号和变种

就像Master System一样,NEC弄了很多修订版和奇怪的变种型号。这从一开始就让跟进型号这事变得麻烦和困难。 因此,为便于今后参考,下面是最重要的机型:

本文将重点介绍PC Engine/TurboGrafx-16,但也会讨论一下那些导致PC Engine Duo/TurboDuo发布的扩展设备。


中央处理器 (CPU)

在这台游戏机里,我们发现了HuC6280,这是一个由Hudson Soft制造的芯片,里面有两大组件。 其中之一是CPU,能以两种速度运作:~1.79 MHz~7.16 MHz.

HuC6280不像Z80那样是现成零件,而是由NEC设计的专用CPU。 查看官方文档之后,几乎可以确定它复刻了著名的MOS 6502WDC的65C02的很多行为。 如此说来,所有这些对程序员意味着什么呢?

在开始之前,我们已经在NES的文章中介绍了MOS 6502的一些部件,在SNES的文章中也介绍了由WDC和理光制造的16位变体芯片。如果你想,可以先看看。

65C02是西方设计中心(WDC)制造的MOS 6502的一个改进型,由于它的制造工艺(CMOS),运行效率要高出很多。 从软件方面,65C02增加了一些新的指令,并修改了一些现有指令的行为[1]

我们可以更多地谈谈65C02,但我认为最好还是重点讨论哈德森增加的功能(对65C02的补充),因为它们对有效操作这台游戏机至关重要。 与65C02对比,HuC6280有[2]

最后,有8KB的RAM可提供给一般用途。

内存访问

有一件事我没有提到,那就是NEC还在CPU旁边添加了一个内存管理单元或者叫“MMU”,使其能够把持21位地址(记得原本6502只有16位地址)[3]。 因此,可以访问的内存总量从64KB提升到2MB

这款MMU非常不同于现今的任何一款MMU,我会说前者更接近于一个mapper。 尽管这么说,PC Engine中的MMU是由八个8位寄存器(称为映射寄存器或 “MPR”)组成,它们与CPU的16条地址线结合起来,形成了21位地址总线。

Image
MMU的寻址方法

它做了以下工作:

  1. CPU可以使用特殊的TAMTMA指令,分别从任何MPR读取和/或写入。
  2. 当物理内存被访问时,MMU保留了来自CPU的地址线A13-A15,来选择八个MPR其中的一个。
  3. 最终的地址,是由CPU线(置于A0-A12)和MMU线(置于A13-A20,输出就是所选MPR的8位值)结合而成,结果即21位地址。

因此,这款MMU将物理内存分组为8KB的页(13条CPU线=8KB页),这是CPU不借助交换MPR或改变其值,就能访问到的内存量。

不管怎样,如果你对它难以理解,就不要勉强自己(这只是一种非常规的工作方式,有些人可能觉得有意思)。


图形

这块功能由 Hudson Soft HuC6270,又被称为 视频显示控制器(Video Display Controller)或“VDC”的一块单独的芯片负责。 HuC6270会绘制玩家将会在屏幕上看到的所有东西,且它的功能和世嘉机子上的对应芯片非常相似,所以请先看看那篇文章,因为我将重点介绍Hudson的这块芯片的不同之处。

内容的组织

首先,VDC是 图块引擎(在第五代游戏机出现之前几乎是标准),但请注意PC Engine包含64 KB的VRAM,这与其竞争对手相比是相当大的。 这可能会带来一种新的内容类型,我们稍后将对此进行验证。

Image
VDP的内存架构。

图形数据的排列方式有点混乱:CPU和VDC都使用16位地址,但CPU只能处理8位字,而HuC6270却在VRAM中存储16位字。[4] 这意味着RAM中的单个地址存着一个字节,而VRAM中的单个地址存着两个字节,所以开发者们在向VRAM传输数据时必须注意这一差异。

原因在于Hudson组织电路的方式:VDC有一条16位地址总线,但只有前15条线受控(最后一条线始终设置为’0’),因此奇数地址从第二个字节获取。 我不知道Hudson为什么要这样做,但我知道,如果系统有128 KB的VRAM,所有这一切就更合理了(因为16位地址总线最多只能访问64 KB,所以通过某种方式将数据总线加倍,最多可以检索128 KB)。 或许那是Hudson/NEC的原计划?

构造帧

抛开前面提到的颗粒度问题,VDP的功能非常简单。 其子系统有三个主要组件:我们已经讨论过的VDCVRAM,和视频编码器(又称“VEC”,我们将在适当的时候看到更多有关它的信息)。

整个子系统可以使用多个分辨率,这是因为游戏可以改变一组寄存器,这些寄存器作为控制显示时序的参数,反过来改变显像管开始传送帧的时间(相对于过扫描)。 其最小分辨率为256 × 224像素 [5],尽管一些自制软件已经证明这个系统能跑在高达512 × 240像素的分辨率下。

现在让我们一步步看看游戏的一帧画面是怎么画出来的,为此我借用了PC原人(Bonk’s Adventure)的资产。

图块

Image
VRAM中发现的背景图块
Image
VRAM中发现的精灵图块

简单来说,图块就是8x8像素的位图,渲染器会获取这些位图来绘制屏幕的一部分。 在VDC中,帧由两个平面组成:背景层和精灵层。

在VRAM中有一个称为字符生成器的区域,其中定义了背景层专用的图块。 图块的每个像素占4位,因此最多可使用16种颜色。 理论上,最多可定义4096个背景图块,但由于VRAM较小,实际定义的数量较少。

另一方面,精灵是使用VRAM中单独内存位置的图块绘制的,这就是所谓的 精灵生成器,与之前的字符生成器不同,这里的图块宽度为16x16像素

视频编码器是一个独立的芯片,存储32个调色板(16个用于背景,16个用于精灵) [6],每个调色板存储16种颜色,每种颜色的宽度为9位(红色3位+绿色3位+蓝色3位)。

排序图块

Image
单个背景图块的结构
Image
单个精灵图块的结构

这部分内容是为那些对Hudson如何利用64 KB VRAM和16位颗粒度感兴趣的人编写的,但您不必完全理解这部分内容,也可以继续阅读文章的其他部分

到目前为止,我们已经讨论了图块的每个像素使用4位(或半字节,也称为nibble)存储。 现在,Hudson规定,图块由四个8x8位图组成(分别称为 “CH0”、“CH1”、“CH2”和 “CH3”)。 每个图块的宽度为1位,但四个图块组合在一起后,就形成了具有4位像素的最终图块。

还记得 VRAM 的16位对齐方式吗? 每个16位字存储一行两个1位位图(8行 + 8行)。 因此,写入8个条目后,将存储两个位图(而不是一个)。 请看下图,以便更好地理解这一点。

同样的情况也会发生在精灵图块上,但由于它们是16x16位图,因此每个位图占用16个字。 换句话说,存储一个精灵图块需要64个字(相当于VRAM中的8字节)。

背景层

Image
已渲染的背景层

背景层是由VRAM中的条目填充背景属性表而构建的,每个条目的位置定义了屏幕上图块的X/Y坐标。 每个条目都包含字符生成器中的图块索引和调色板。

该层的最大尺寸为1024x512像素(128x64图块),但程序员可以设置一个256x256像素(32x32图块)的最小层。

与往常一样,通过更改VDC中某些寄存器的值,该层可以滚动。

精灵层

Image
渲染的Sprite图层.

VDC 包含一个名为精灵属性表缓冲区的内部存储器,最多可定义64个精灵。 表中的每个条目都存储了独立的X/Y位置、调色板、图块索引和H/V翻转。 此外,还有一个属性允许将一个精灵与另一个精灵合并。

每个条目长度为8字节,但由于颗粒度为16位,会浪费一些空间

最重要的是,CPU无法访问该表,因此它需要在VRAM中完成,然后激活DMA通道将其复制到VDC(以便后者可以使用)

至于限制,每个扫描线最多只能有16个精灵。 另一方面,可以设置中断,以便在出现精灵溢出或碰撞时通知游戏

结果

Image
嗒哒——!

到目前为止,我们已经看到VDC如何完成所有繁重的工作,但最后一项任务实际上是委托给视频编码器,或者叫“VCE”的。 Hudson将这款芯片命名为HuC6260,其基本功能是接收来自VDC的9位数据流,应用调色板,并将结果发送到电视(以模拟信号的形式)。

如果您读过以前的文章,可能会对定时的重要性有所了解。 这里也不例外: 为了避免不必要的伪影(如“雪花屏”),VCE只能在垂直中断时更新。

视频输出

视频编码器输出RGB(以及同步)和YPbPr信号,这分别是与SCART电缆或分量电缆配合使用的理想选择。 目前看来效果不错!…

Image
PC Engine右侧的射频端口。
Image
为TurboGrafx-16设计的“Turbo Booster”[7],连接至扩展端口以支持复合视频接口和供电。

…… …遗憾的是,Hudson决定安装一个射频调制器,作为开箱游戏机时获得视频输出的唯一方法,所以它毕竟不是那么好。 不过话又说回来,PC Engine是80年代设计的,因此这种方法保证了与各种电视机的兼容性(假设它们来自游戏机的同一地区)。

好的一面是,扩展端口包含可传输RGB视频和多种同步信号类型的针脚,但需要外接配件才能使用。


音频

与本网站分析的许多其他第三世代游戏机一样,PC Engine也包含一个可编程声音发生器,或者叫“PSG”。 另一方面,这种PSG特别依赖波形存储器(也称为 “波形缓冲器”)来合成声音,而不是使用一组预定义的波形(如方波、三角波等)。 波形存储器使程序员能够定义自己的波形,从而为配乐编排提供更大的灵活性。

R-Type (1987)

该系统有6个音频通道 [8],每个通道都是通过写入一组寄存器来设置的。 寄存器存储了各通道的属性,其中包括:

额外功能

某些通道组具有其他操作模式。 例如,最后两个通道与噪声发生器相连。 此外,第二个通道还可以充当低频振荡器,对第一个通道进行调制(我起初以为这是调频合成的同义词,但低频振荡器更像是实现颤音效果的 “子集”)。

说到模式,还有一种叫做直接数模转换(DDA)的模式,可以让CPU直接写入音频缓冲区(绕过PSG)。 因此,PC Engine可以播放PCM采样。 这些采样仍然是5位的,而且非常依赖于CPU周期。 不过,两个通道可以组合重现10位采样! 我强烈建议您查看“来源”部分,聆听示例[9]

总之,这使得PC Engine的PSG成为一款非常灵活的硬件。

最终的声音

PSG将混合所有信号并输出立体声信号。 但同样,除非您找到绕过射频端口的方法,否则只能从电视上听到单声道音频。


I/O

这款游戏机有大量的配件,其中一些完全增强了游戏机的内部功能(例如提供更多内存)和外部功能(增加更多端口和/或读取其他存储介质的可能性)。

Image
PC Engine背面的扩展接口

这在很大程度上要归功于游戏机背面的扩展接口,它可以接入以下组件 [10]

我很想知道NEC或Hudson在多大程度上设想了这种游戏机,他们是否试图制造某种可以升级到下一代的 “模块化游戏机”?

其它

我还没提到它的控制器(或“手柄”,有些地方这么叫它)。 它与其他产品非常相似。 游戏机只提供一个控制器端口,游戏会检查内存中的一个地址来获取按键。 该地址返回一个4位值[11]


操作系统

在游戏运行之前,没有内部ROM或“BIOS”或其他任何东西,因此我们这台机子没有操作系统。 复位向量位于地址$FFFE$FFFF处(请记住,内部寄存器是8位的,但内存地址是16位的,因此我们需要两个字来初始化程序计数器),这些地址指向游戏卡[12]

这也意味着,“做家务”(即初始化内存、设置MMU等)这事将由程序员来完成……


游戏

程序以6502汇编语言编写,并添加了额外的65C02操作码和Hudson引入的操作码。

标准介质

NEC/Hudson并没有依赖于其他厂子似乎都喜欢的笨重而乏味的卡带,而是设计了另一种媒介,这次是一种信用卡大小的媒介,名为HuCard。 它们源自一种名为“Bee Card ”的旧媒介,一些MSX游戏曾使用过这种媒介。

Image
典型的零售游戏

奇怪的是,它们与世嘉卡(Sega Card)非常相似,但却包含38个引脚,而不是35个[13]。 内部差异则更为明显:

CD-ROM扩展

该扩展端口为大量配件和扩展装置打开了大门,最终将一个简单的PC Engine变得完全不同。 如果这还不够,HuCard插槽还能补充扩展的可能性。 我想说的是,在这篇文章中,我必须把重点放在显著的升级上(其中一些升级已被纳入控制台的未来版本中)。

Image
CD-ROM²读取器(TurboGrafx-16 版) [15]。 他们当时在做 Discman 业务吗?
Image
用于连接主机和读取器的底座[16]。 它还提供电源和复合视频输出。
Image
所有组件组合起来的样子[17]

让我们来看看CD-ROM²扩展,它由一个CD-ROM读取器和一个名为系统卡(System Card)的特殊HuCard组成,后者充当BIOS引导游戏,并提供一些例程来连接读取器。 读取器内部有64 KB RAM用于一般用途,另外64 KB RAM用于ADPCM采样流,最后2 KB用于保存数据。 正如您所猜测的那样,这使得游戏开发人员能够利用额外的存储空间和CD音频,同时也为出版商提供了经济上的宽松条件,使他们能够以非专有媒体的方式发行游戏。

几年后,NEC推出了另一款CD模块,名为超级 CD-ROM²(Super CD-ROM²),虽然读取器的硬件基本保持不变,但其通用 RAM 增加到了 256 KB。 已经拥有CD-ROM²设备的客户可以通过购买超级系统卡(Super System Card)进行 “升级”,超级系统卡包括额外的RAM(和一个额外的输入/输出例程!)。 除此之外,NEC 后来还提供了名为街机卡(Arcade Card)的新BIOS更新,其中包含2 MB内存。

基于CD的游戏严格依赖于为其开发的BIOS卡,尽管较新的卡可以向后兼容(但也有例外)。 因此,对于想玩几乎所有基于CD-ROM的游戏的用户来说,街机卡是首选。 我之所以提到“几乎”,是因为第三方公司也推出了自己的 BIOS 卡(即 “Games Express CD 卡”),要玩该工作室的游戏,就必须使用这些卡。

随着超级CD-ROM²的推出,NEC/Hudson还推出了PC-Engine/TurboGrafx-16的新变体Turbo Duo,它将控制台、读卡器和BIOS卡捆绑在一个包装中。

其它扩展

如果您想了解已发布的其他扩展,请查看在线目录[18]


反盗版和自制游戏

HuCard卡带会锁区,这意味着PC-Engine游戏不能在TurboGrafx-16上开箱即用(反之亦然)。 这是因为数据线的顺序在美版上是颠倒的。 正如您所猜测的那样,这不是一个廉价转接器无法解决的问题。 不过,游戏中可能会包含检查系统区域的例程。

另一方面,CD-ROM游戏既不锁区也不防拷,但请记住,它们仍然需要系统卡来启动(这是有区域锁定的)。


这就是全部了,伙计们。

Image
我的PC Engine通过射频线输出显示(怀旧用途… …我认为)。 非常感谢 Matt 的捐赠!

就这样了! 您刚刚阅读了今年的最后一篇文章。

对于网站来说,2020年是“有趣”的一年(抛开那些影响我们所有人的负面事件不谈)。 这一年从Wii文章开始,然后是PS2Xbox任天堂DSMaster System,最后是这篇文章。

访客数量也发生了很大变化。 起初,它的发展缓慢,但在夏天,它的访问量高得惊人。 我要感谢 Hacker News 用户、OSNews、Reddit、Gigazine、YouTubers、Twitter 用户以及其他许多论坛和用户分享了这些文章。 当然,我还要向那些慷慨解囊、帮助网站维持运营的捐赠者们致以崇高的敬意!

祝大家圣诞快乐,2021 年新年快乐,下次再见!
Rodrigo


参与贡献

这篇文章是 游戏主机架构 系列的一部分。如果您觉得我的文章很有趣,请考虑捐赠。您的资助将用于购买工具和资源,以帮助我提高现有文章和即将发表的文章的质量。

Donate with PayPal
Become a Patreon

你也可以购买英语版本的电子书。我会将获得的利润视为捐赠。

Image

特别感谢下列人员的捐助:

- Carlos Diaz Navarro
- Colin Szechy
- David Portillo
- Duncan Bayne
- Eric Haskins
- Grady Haynes
- Josh Enders
- Olivier Cahagne
- Samuel Shieh
- Sanqui
- Thomas Peter Berntsen

或者,您可以通过 建议更改添加翻译 来提供帮助。


Copyright and permissions

This work is licensed under a Creative Commons Attribution 4.0 International License. You may use it for your work at no cost, even for commercial purposes. But you have to respect the license and reference the article properly. Please take a look at the following guidelines and permissions:

Article information and referencing

For any referencing style, you can use the following information:

For instance, to use with BibTeX:

@misc{copetti-pcengine,
    url = {https://www.copetti.org/zh-hans/writings/consoles/pc-engine/},
    title = {PC Engine / TurboGrafx-16 架构 - 一份实证分析},
    author = {Rodrigo Copetti},
    year = {2020}
}

or a IEEE style citation:

[1]R. Copetti, "PC Engine / TurboGrafx-16 架构 - 一份实证分析", Copetti.org, 2020. [Online]. Available: https://www.copetti.org/zh-hans/writings/consoles/pc-engine/. [Accessed: day- month- year].
Special use in multimedia (Youtube, Twitch, etc)

I only ask that you at least state the author’s name, the title of the article and the URL of the article, using any style of choice.

You don’t have to include all the information in the same place if it’s not feasible. For instance, if you use the article’s imagery in a Youtube video, you may state either the author’s name or URL of the article at the bottom of the image, and then include the complete reference in the video description. In other words, for any resource used from this website, let your viewers know where it originates from.

This is a very nice example because the channel shows this website directly and their viewers know where to find it. In fact, I was so impressed with their content and commentary that I gave them an interview 🙂.

Appreciated additions

If this article has significantly contributed to your work, I would appreciate it if you could dedicate an acknowledgement section, just like I do with the people and communities that helped me.

This is of course optional and beyond the requirements of the CC license, but I think it’s a nice detail that makes us, the random authors on the net, feel part of something bigger.

Third-party publishing

If you are interested in publishing this article on a third-party website, please get in touch.

If you have translated an article and wish to publish it on a third-party website, I tend to be open about it, but please contact me first.


来源 / 继续阅读

音频

CPU

游戏

图形

I/O

操作系统

影像


Rodrigo Copetti

Rodrigo Copetti

希望你能喜欢这篇文章!如果想了解本文作者的相关信息,点击这里 如果你想支持他,请点击这里

rsslinkedintwittergithub facebookreddit