至于NES(大多数情况下也是SNES),这是一个基本概述。我没有写任何NES游戏,但是写了NES模拟器(Graybox),并对旧车进行了大量的改造工程。
至于编程语言:是的,都是汇编语言。对NES进行编程意味着直接使用硬件中断,DMA端口,存储区切换等。幸运的是,对6502(或者说2A03)进行编程非常容易[1]:
- 寄存器很少:主要是A,X和Y,后两个仅用于索引和迭代
- 指令集很小,通常很简单
- 内存不多:主RAM为2KB,可选电池支持8KB扩展。在这2KB中,为堆栈保留256个字节,由于某些特殊的寻址方式,第0页(前256个字节)是您要存储最常用的指针和值的位置
这三件事共同构成了一个易于记忆的环境。是的,您可以自行管理所有内存,但实际上这意味着您要创建一张完整的地图,说明一切进展顺利,而且该地图并不是很大,因为您只需要担心2K,因此可以将其绘制在一张方格纸。您必须多计划一些事情,并将变量和常量静态分配给RAM和ROM(盒式磁带)位置。
一旦您的卡式盒数据超出了CPU的可寻址限制,它就会变得有些棘手。那是64KB,其中较低的32KB是固定的,并映射到各种硬件端口和RAM。这是存储区切换起作用的地方,这意味着将ROM的一部分映射到较高的32KB地址空间中(的一部分)。
可以根据程序员的需要使用此功能,但示例使用的游戏可能是具有3个级别的游戏,每个级别的所有级别数据,元数据和代码都塞在盒带上单独的8KB内存区域中。该级别可能具有例如初始化,每帧更新等的回调。“加载”该级别意味着将8KB的内存块映射到例如0xC000。然后,您可以指定初始化例程始终为0xC000,帧更新例程为0xC200,级别数据从0xC800开始。然后,将游戏的主要代码存储在另一个内存块中,只需在合适的时间交换正确的块并跳转到绝对地址0xC000和0xC200即可控制级别更改。
Wrt图形数据:NES的图块数据是2位8x8像素图。对于背景,它们与1/4分辨率2位图层结合在一起。然后将这些4位值索引到16项调色板中,我相信可以使用53种有效的独特颜色。Sprites还使用2位像素数据,每个Sprite都指定了自己的2位组索引,从而再次形成了4位pal索引。屏幕上的BG图像是32x30的瓦片索引号数组。
本质上,通过进行大量重复和索引索引,可以使数据保持很小。物位数据通常存储为图块索引的垂直条,并且由于这些垂直条也被重复使用,因此这些索引也被索引,并且仅在盒式磁带上存储一次。简单数据压缩技术的工作原理与此类似。这使Mario 1可以存储32KB的数据(有剩余空间)和8KB的位图数据。
至于开发环境,我看过一些照片,人们在这些古老的计算机上工作,这些计算机连接到EEPROM刻录机进行工作。直到SNES时代[2]之后,工具辅助调试才真正成为可能。这是许多旧游戏中存在“明显”错误的主要原因,以及为什么像Gameshark这样的事情可以做他们所做的事情。播放器的健康状况始终位于内存位置X,因此您可以始终将其设置为100。
如果您觉得这些事情有趣,我鼓励您查看例如http://wiki.nesdev.com/w/index.php/Nesdev_Wiki。
还有许多关于NES的编程课程也可以在网上找到。
我希望这个简化的概述可以让您对80年代的游戏开发有所了解。
[1]相对而言。当我在大约85%的PowerPC程序集中编写Graybox本身时,我也有偏见。[2]参见FF6文章的制作:http://www.edge-online.com/features/the-making-of-final-fantasy-vi/