[转载](https://www.zhihu.com/answer/73558284 )
[转载](https://www.zhihu.com/answer/197728555)
[转载](http://www.vgtime.com/forum/1062097.jhtml)
【买游戏送显卡?!FC强化芯片完全盘点!!(音频篇)-哔哩哔哩】
【买游戏送显卡?!FC强化芯片完全盘点!!(视频篇)-哔哩哔哩】
梦开始的地方——FC游戏开发指南
电脑游戏机硬件与编程特技.pdf 大多是在说学习机上的FBASIC和GBASIC,开发简单程序,而复杂的程序(FBasic和GBasic)和功能(卷轴)使用6502汇编开发。最初的Basic没有文本编辑器或字处理器,所以行号以10为间隔留空,给代码插入的空间,行号+重写代码更新那行代码
任天堂游戏编程探密.PDF
任天堂产品系统文件.PDF
惠普HP64000/pascal开发程序
外接Famicom程序或6502处理器卡
HP64K富士通Fujitsu FM R-50 HD PC 制作图形
它是一个IBM-PC兼容机,运行MS-DOS的一个版本,下面是超级马里奥3的像素艺术作画
Fujitsu FMR-50FC游戏也有类似于今天的主机游戏的开发环境,但并不唯一。
简而言之,就是一台用于开发的电脑主机以及若干仿真外设。当然80年代的电脑主机和现在差别很大。代码图形也都是在这台主机上完成。编写语言为ASM(汇编语言)。卡带机时代主要的开发语言就是汇编,那时候不会用C语言。
下图是一些开发环境的例子,80年代初期用的是HP 64000,上面安装的PASCAL,但并不唯一。不同厂商所使用的环境有所差异。编写好的程序通过Emulation Probe上仿真测试,由于Emulation Probe代价很昂贵,并不是所有厂商都能有。没有该设备的情况下,就直接通过ROM仿真器插在FC实机卡槽上测试。
80年代后期标准开发环境是由INTELLIGENT SYSTEMS开发制定。由一块FC仿真板连接到富士通FMR系列电脑上进行开发调试。
IS是任天堂旗下所属公司,作为硬件和软件的开发支援公司,同时IS也有自己的知名游戏(火焰纹章,纸片马里奥,高级战争,瓦里奥制造等)
日本FC的官方授权游戏最后一款是1994年的冒险岛4。在那之前或者之后,无论是中国国内还是国外,制作盗版的FC游戏卡带,都会有各自的开发硬件和仿真器。
当时6502的性能实在捉鸡,编译出来的C代码跑起来那速度,画面太美不敢想象,只能手写汇编,没有宏汇编,就需要开发人员手算地址写入内存。到80年代后期,宏编译器普及之后程序员们可算从计算地狱之中解放了出来…… 当然也不会有什么随时随地Debug执行一下看看效果之类的说法,想要看效果,就必须把写好的程序和临时素材烧进EPROM里面(那个年代EEPROM也是稀罕货,可编程ROM基本都是一次性的,这都是成本,也直接阻止了程序员们的大部分“试试看”的想法),在实机上执行。 需要Debug的信息么,就自己输出到画面上,于是就会产生游戏完成的时候程序员忘了把Debug模式删掉导致一些奇怪的秘籍的诞生…… 而硬件Debugger是SFC才有的,彼时已经1990年,是FC发售的7年之后了……
对于卡带rom,硬件则会做romter,所谓的romter就是用ram代替flash rom/eeprom, 游戏卡不是要烧到rom中才能玩吗,早期的可能还没有flash rom, 都是maskrom, 烧不进去啊。后来有了eeprom,但是贵啊,烧写寿命都有次数限制,而且烧一次比较慢,有这个东西,就简单了,几乎可以无限写,无限擦。在没有软件开发仿真环境的2000年以前,基本每个fc游戏开发作坊都要搞这个。当然,现在是dumper/flasher这些东西,软件模拟器,烧录卡都很成熟。但是如果是做一个自定义mapper的游戏,则模拟器都未必能运行,此时还是需要硬件仿真,软件在开发的同时硬件需要做板,也就是产品和开发设备同步都一起做。当然可以开发的时候先用通用mapper类型做,快接近项目完工的时候转换一下mapper,用特殊硬件发布,目的为了防抄板。
真正财大气粗的公司,比如那些街机大佬出身的NAMCO。 他们在开发的时候一是硬件资源充足,他们可以用小型机写代码!他们能用VAX!那个年代这根本就是大杀器,都可以用软件或者一些外围硬件做各种模拟器(Emulation Probe)。那个年代硬件结构也相对简单,任天堂并没有做任何硬件保护,这帮人完全可以彻底分析硬件,然后用比如HP 64000之类的硬件开发平台,配上自己做的一些硬件模拟器,那开发效率自然是刚刚的。这些公司对FC硬件架构吃透之后,甚至可以自己开发第三方的MMC(内存映射控制器,可以让FC通过切换BANK的方式寻址多于64K的地址空间),并添加一系列音频增强功能! 二是人力资源充足。我是说那种站在那个年代的角度的“上古程序员”。他们莫说汇编了,70年代做开发的时候都是直接手写二进制代码!这就意味着在什么平台上都可以进行开发。
还有一些中大型公司,他们可以买一些当年被称作ROM模拟器玩意,通过串口把数据传输到板子上运行。比那些小型机,硬件开发平台之类的便宜很多,但是依然不是小型公司能买得起的……
美术方面,由于游戏画面的特殊性(通常是一个固定的背景,上面有一些能够活动的物体),所以FC的画面是背景+活动快构成的。而这些背景和活动快则是由一个个8x8像素的Tile构成的。而且由于屏幕分辨率的低下(256x224)、以及固定调色板的彩色模式(只有固定的54种颜色可以使用),所以艺术家们只能通过像素艺术(Pixel Art)来表达自己的想法。 而画画这种事情并不需要在目标机器上进行,财大气粗的公司可以选择一些图形工作站,比如施乐的一些高档货色,那个年代的程序员们也比较热衷于造轮子,弄台苹果2,接个彩电,写个画点阵图的程序也未尝不可。无论如何,只要图画出来,并且能够转换为FC的PPU(图像处理器)能够识别的数据就可以了。当年KID公司的作曲家盐田信之还用过NeXT来给SFC图形制作
声音上,那个声音“生成”芯片(也就是凭空生成波形的,并不是通过合成PCM采样来播放音乐的)作为主流的年代,MML似乎成为了一种既定标准,当然,它易于被程序处理,简洁易记等特点也决定了程序员们不会在这方面造一些不必要的轮子。MML是一种音乐记述语言,是一种文本化的乐谱。当年诺基亚的铃声编辑也是MML的一个变种。 作曲家用MML写好音乐之后,程序员就会把它转换成自己的音频引擎能够识别的二进制格式,合并到游戏数据之中。
于是,现在程序,图像,声音都有了,剩下来的就是烧进ROM里,接到机器上,Debug! 而Death March什么的那个年代也很常见,这个跟现代没什么区别,基本上都是临近发布的那段时间没日没夜加班加点赶工。
好了,Bug没了,到了截止日期了,Master掉,提着软盘去任天堂
在电脑技术愈发发达的今天,仍然会有很多怀旧爱好者会HACK或者制作新的FC游戏。现今开发FC游戏,基本上全部都能在windows电脑上完成了。用于仿真开发的软件也非常齐全。比如NESASM,CC65,VirtuaNES模拟器等。当然,制作出来的游戏,可以在模拟器上运行,但并不表示做成卡带能在实机上玩。这时候仍然需要烧录卡或者其他卡带仿真设备来测试了。
德国牛人写了个6502的C编译器。是一个开源软件CC65。
主机硬件参数
CPU:Ricoh 6502芯片
CPU主频:1.8MHz
PPU:Ricoh 2C02图像控制器
PPU频率:2KB
MEM:2KB
ROM:32KB
CHR:8KB
画面:总发色数53色,同屏幕最多显示其中13色,NTSC制式下的分辨率为256×224
pAPU:Ricoh 2A03伪声道处理器
音源:单声道,2个矩形波,1个三角波,1个杂音,1个PCM合成音源
CPU与CHR的关系
8bit -> 索引(0-255) -> 256 TILE -> 256×8×8×2bit PX-> 256×16B Sprite->4KB CHR
命名表和PPU的关系
(256×224)/(8×8) -> 32×28×1B -> 896B -> 1KB PPU
CPU与ROM的关系
CPU直接寻址空间为32K,所以ROM为32K
PPU与CHR的关系
PPU直接寻址空间只有8K,所以CHR ROM为8K内存
FC为何使用理光制造的8位的6502中央处理器和2KB的图像控制器,还有2K的内存?
这是出于当时的成本考虑的,是符合当时的技术水平和环境的,当时的rom是非常昂贵的,大容量存储技术还不成熟。FC的CUP和PPU通过控制电路以及卡槽和游戏卡带相连。由于电路设计和处理能力的原因,CPU的直接寻址空间只有32K。而PPU的直接寻址空间只有8K。
所以,一块基础的FC游戏卡是由一块存储了游戏程序数据(PRG)的32K的ROM和一块存储了图形数据(CHR)的8K的ROM构成的(早期还有16K+8K=24K这种更低容量的卡带)
一颗可显示53种颜色的图像控制器(PPU),画面可显示2层卷轴和5个页面,其中2个背景页面(或者命名表)各占用1KB显存。 FC的硬件层面只支持64色,这64色里面还包含12个相同的黑色,所以实际的颜色只有53种。这些颜色是在硬件层面被固化了的,FC能显示的颜色只能在这53种中选择。FC每一个背景画面对应一个16字节的调色板,理论上每个调色板能显示16色的画面,这16色分为4组每组4色,但每一组的第一个颜色是相同的,所以FC游戏背景同屏只能显示13色。FC游戏的每4个字符块,组成一组2X2的基块,这4个字符块共用调色板中的一组颜色。此外,FC的精灵显示和背景无关,他有单独的寄存器地址和调色板理论上同屏能显示的颜色是背景的13种加上精灵的13种一共26种。由于显存的限制,最多只能显示13种颜色,调色盘可显示 48 色及 5 个灰阶,选取3种颜色,“透明”也算一种颜色(此时显示背景的底色,用0F表示),一共4种颜色。受ROM限制,一个画面可显示 256/4B=64 个角色(sprites) ,角色格式为 8x8 或 8x16 个像素,一条扫描线最多显示 8 个角色,虽然可以超过此限制,但是会造成角色闪烁。
64色调色板一颗可编程的声音发生器(PSG),其中3个模拟声道演奏声乐和1个杂音声道表现特殊声效(爆炸声,枪炮声等),音频采样回放通道用来表现连续的背景音。
作图方式
FC运作的方式,就像是从背景CHR字符库里根据命名表选出指定的方块图案,放到指定的位置上,因此每个场景都需要花费一定的容量去记录方块的摆放方法。由于8bit的数据带宽,所以索引范围为0-255,也就是方块最多只有256个。
32×28图像 32×28命名表 16×16字符库CHR画面限制
背景和活动块的每个单位,都是8x8像素大小的图案,而屏幕分辨率是256×224,因此FC呈现的画面本质上是一个32x28的网格,一个索引只占一个字节,因此,命名表占用896B内存
那么,在一个2页8KB大的CHR里,留给活动块的空间是多少呢?答案是只能摆16×16=256个
CHR图库(左)CHR 8KB ROM
一字节八位,1B(Byte)=8b(bit)
每个像素是用2个bit表示,00标识调色板里第一个颜色,01是第二个,10是第三个,11是第四个
每个图片方块是8*8像素 也就是2bit*8个像素每行*8行每个图片方块,也就是一个图片方块128bit,也就是16字节一个图片方块,
存储容量,图形像素和字节(或者位数)的关系
8KB/128b=(8×1024×8)/128b=512图形
8KB/16B=(8×1024)/(128/8)B=512图形
(16×16)×2=512图形
8K的CHR里是分成2页,是256*2个 512图形
因此,8KROM CHR只能存512个图形方块,一页存256个图形方块,一个图形方块包含16字节128位二进制数据。总的来说,一页4Krom只包含256个16字节(2位像素的8×8精灵图/8位)的图形方块数据。
背景 256×224
精灵图 8x8像素(或者8×16)
屏幕方块(256×224)/(8×8)=32×28
命名表 32×28×1B=896B≈1KB
命名表索引 32×28
CHR拼图库 16×16×16B=4KB
拼图方块16×16
(16×16)/(32×28)=28%
整个背景只有28%的内容是不重复的,剩下的72%必须重复,这是逼死美工狮的节奏啊。下图就是周边大量重复,而中间一小块图画面色彩复杂多样,所以FC游戏的过场动画大多都是很小的一块屏幕。由于 CHR 只能存得下256个方块,玩家们最终看到的动作、敌人、场景,无非都是素材的重复堆叠和利用
集中式图像全屏?美工狮:“臣妾做不到啊!”
FC游戏已经把素材重复利用发挥到了极致。
云和树云和树用了拼图库里同样的6个方块,只是使用调色板换了颜色而已
MMC5强化芯片
MMC5是任天堂最强大,最昂贵的MMC。虽然在音频扩展方面有点被吊打的感觉,但是图形方面的强化绝对是NO1。这块芯片具有1 KB的额外内存,而FC本身的内存仅为2K。它优化了垂直分割卷轴的实现方式,大幅强化了图形功能,使用MMC5每个画面可以使用16,384个不同的字符块,而不是在4X4K字符库容量限制下的256个,并且允许每个字符块拥有自己的调色板,而不是上面说的每2x2快一组共用一个调色板。因为有了这些增强,虽然FC游戏画面的显示任然跳不出同屏13色,每个字符块不超过4色等限制,但是得益于对色彩更精准的控制,以及更多的字符块可用,MMC5芯片制作出的图像比起之前精细程度大幅的提升,当中最明显的例子自然就是合金之光了。前面我们说过,FC游戏画面最基础的显示单位是一个8X8像素的字符块,无法做到以像素为单位去进行精确绘图,而金属之光的人物立绘和CG,发色数虽然依然很低,但是线条的复杂程度是远超大部分FC游戏的。要想通过字符块组合出这么复杂的线条变化,必须使用大量的字符块,这一点,只有搭载这款芯片才能实现。
红白机画面之王 NESASM
网友评论