任天堂游戏编程探密(2)

🏠 首页 《无线电》杂志 1994年 🔗 第3期 🔗 第28页 分类:无线电技术自学经验交流 🔗 于春 🔗

二、任天堂游戏的软件特点:

1.任天堂游戏的软件结构

任天堂游戏软件结构可分为两大类:基本结构和扩展结构。

①基本结构

基本的任天堂游戏软件容量为40K字节(标准卡标注为LB)。典型游戏如:《1942》、《超级玛丽》等。其中32K字节为游戏控制程序,供CPU执行;8K字节为图形字模,由PPU处理。另外还有一种低配置结构,软件容量为24K字节(标注为LA),这是一种早期软件。其中控制程序为16K字节;字模为8K字节。典型游戏有:《火箭车》、《马戏团》等。

40K软件的控制程序存放地址在CPU管理的$8000~$FFFF空间;字模地址在PPU管理的$0000~$1FFF空间。16K软件的控制程序存放地址为$C000~$FFFF;字模地址也是$0000~$1FFF。

②扩展结构

40K以上的软件均为扩展结构。它们在基本结构的基础上或者扩展控制程序区,或者扩展字模区。扩展方法是在某段地址范围进行空间存储体切换。一般程序区在$8000~$BFFF空间切换;字模区在$0000~$1FFF空间切换。切换种类按软件容量的大小略有不同:

对于48K卡(标注为LC),其程序部分为32K;字模部分为16K,分2个8K存储体。典型游戏有《七宝奇谋》、《影子传说》等。

对于64K卡(标注为LD),其程序部分为32K;字模部分为32K,分为4个8K存储体。典型游戏有《迷宫组曲》、《冒险岛》等。

80K的游戏不多(标注为LE),常见的有《中国拳》、《金牌玛丽》等。其程序部分为48K,前32K分为2个16K存储体;字模部分为32K,分为4个8K存储体。

128K卡(标注为LF),其程序部分与字模部分混合共用128K,分为8个16K存储体,其中前7个存储体地址映射于$8000~$BFFF;最后一个存储体(称为HOME BANK)映射于$C000~$FFFF。典型游戏有《魔界村》、《怒》、《1943》、《1944》、《特殊部队》等。这类游戏卡中一般都配有一块8K的RAM(动态随机存储器)存储当前使用的字模。

160K卡(标注为LG),其程序部分为80K;字模部分为80K。典型游戏有《冒险岛Ⅱ》、《花式撞球》、《欢乐叮当》等。

256K卡(标注为LH),其程序部分为128K;字模部分为128K。典型游戏有《柯拉米世界》、《恶魔城》等。另外,还有《魂斗罗》、《赤色要塞》、《绿色兵团》、《立体篮球》等256K游戏被压缩为128K游戏,目前这类游戏的256K版已不多见,常见的均为128K的压缩版。

对于任天堂系列游戏机,由于CPU的处理速度、画面的解析度、音域音色等方面的限制,即使软件容量再增大,游戏效果也不会提高多少,总达不到街机的水平,故单个游戏的最大容量一般为256K,目前尚未见到更大容量的游戏软件。

③存储体的切换

对每一个游戏芯片来说,都有两类地址:绝对地址(通常称为逻辑地址)和相对地址(通常称为程序地址)。如32K芯片的逻辑地址为0000H~7FFFH,其程序地址则为8000H~FFFFH;再如128K芯片的逻辑地址为0000H~1FFFFH,而其程序地址仍为8000H~FFFFH,这是通过8个存储体空间的分段切换实现的,关于各存储体的切换控制一般是通过一块74LS161(可预置四位二进制计数器)门电路实现的。切换电路原理图如图1所示。

图1
图1 🔍原图 (838×721)

关于前7个存储体的切换控制程序则放在第8存储体的C000H~FFFFH地址中,程序形式如下:

PHA

LDA #$ 0N

STA $FFFF

PLA

JMP $XXXX

其中“N”为切换数据,即存储体的段号;“XXXX”为欲转往该存储体程序的地址。

对照图1可明显看出IC1的各段逻辑地址与切换数据的对应关系如下页中附表所示。

图2
图2 🔍原图 (775×418)

④多节目合卡

随着大规模集成电路制造工艺的完善和提高,高容量只读存储器制造成本迅速下降,极大地缩小了1兆位芯片与8兆位芯片间的价格差距,因而多节目高K合卡应运而生,出现了8合1、16合1、32合1等多节目合卡。这些合卡尽管容量不同,但其节目切换原理与图1的段址切换方式是大同小异的,不同的仅是每段的切换容量根据节目容量的大小从16K~128K不等,不多赘述。

2.任天堂游戏的图像处理方法

①屏幕显示原理

任天堂游戏机的中CPU虽然仍属65系列的CPU,但它的显示方式与中华学习机截然不同。其显示屏幕由三类四层显示页面构成。三类显示页依次为:卡通(角色或动画)页、背景页、底背景页。卡通页用于显示游戏中的角色,它有两个页面:卡通零页——使角度显示于背景之前;卡通一页——使角度显示于背景之后。卡通页的显示分辨率为256×240点,卡通可以以点为单位移动。背景页主要用于游戏画面的显示,它共有4个显示页面,每页的两边互相连接并排成“田”字,采取字符显示方式,显示分辨率为32列×30行,每幅画面为960个图形块构成,游戏中可任取一个页面显示。底背景页主要用于大面积的单色显示,以衬托出蓝天、草地、沙漠、大海等效果,显示分辨率为1×1。四层显示页的排列由前向后依次为:卡通零页、背景页、卡通一页、底背景页(见图2)。系统默认的排列方式为背景00页与卡通页、底背景页四层页面重叠,前面显示页的内容可以遮住后面显示页的内容,因而很容易构成具有一定景深次序的立体画面。

图3
图3 🔍原图 (539×423)

②背景处理技术

任天堂游戏中的背景画面显示采用字符方式,每个字符通常称为背景图形块。每个图形块为8×8点阵,其字模数据存放在由PPU管理的一段内存中,称为背景字库,一般使用$1000~$1FFF地址,共4K字节。每个字模由连续的16个单元组成,故一次最多可定义256个字符,序号依次为0~255。显示字符时,只要把字符序号置入屏幕对应的显示单元中即可。

任天堂游戏中的背景处理由PPU独立完成,每一个背景页面对应PPU的1024个单元,为顺序对应关系。背景00页对应PPU地址为$2000~$23FF,其中$2000~$23BF对应于960个图形显示单元,$23C0~$23FF为该显示页的配色单元;背景10页对应的PPU地址为$2400~$27FF;同样,后面的两页依次对应$2800~$2BFF、$2C00~$2FFF。由于游戏机中只有一块2K的VRAM(PPU使用的RAM),故一般只使用前两个页面,通常称其为背景零页和背景一页。游戏中可通过设置软开关的方法控制画面的横、纵向,以使两幅画面横向并列或纵向衔接。

在实际游戏中,要经常用到背景画面的横向卷动和纵向滚动。如《魂斗罗》游戏中的第一、五、六、七、八关是横向卷动,第三关则是纵向滚动。这些画面位移效果是如何实现的呢?我们知道,中华学习机中的画面位移是通过反复改写显示映射单元的内容而实现的,这种方法处理速度慢、控制程序冗长。任天堂则采取了截然不同的方法。它通过硬件的特殊处理,引入了显示窗口的概念。画面位移时,每个显示单元的内容不变,而令显示窗口向相反的方向移动,从而实现了画面的横向卷动和纵向滚动。如《魂斗罗》中第一关横向卷动的控制方法是;令两个背景页横向衔接,游戏开始时,背景零页绘满32列,而背景一页仅绘制12列,令显示窗口对正零页;当游戏中的角色前进到画面右边的一定位置时,则令显示窗口右移一格,同时绘制一页的第13列;这样,显示窗口每右移一格,画面绘制一列,从而使游戏画面连绵不绝;每移出一页画面(32列)令页数计数器加一,当累计到一定页数时则令窗口不再移动,进行关底处理。这一画面的位移控制极为简单,仅通过向位移软开关$2005置入移位数据就可实现。F BASIC的控制程序为:

10 POKE &H2005, X

20 POKE &H2005, 0

X为位移参数。其机器语言的控制程序为:

LDA X

STA $2005

LDA #$00

STA $2005

画面的纵向位移则更为简单,如《魂斗罗》的第三关——瀑布天险是一个纵版画面,角色要从最底层跳升到最顶层与关底魔头决斗,游戏进程中画面随着角色的跳跃不停上滚。实际上这一位移过程是在一页画面中进行的,控制方法是:每当角色前进到画面上方某一位置时,改写画面最底行的图形数据,使其为即将移入画面的一行;然后令显示窗口向上移一格;由于窗口是在一个显示页上移动,故最底行即是最顶行(这时可把一页画面理解为上、下边对接的圆筒,显示窗口是套在画面圆筒外面稍大的一个圆筒,窗口移动一格就是向上旋转一格)。F BASIC控制程序为:

10 POKE &H2005, 0

20 POKE &H2005, Y

Y为位移参数。相应的机器语言程序为:

LDA #$00

STA $2005

LDA Y

STA $2005

以上画面的送数、位移操作都是在CPU响应非屏蔽中断期间完成的(非屏蔽中断是在电视机的场回扫期间发出和响应的,这时的电视屏幕是黑的),所以我们感觉不到位移的痕迹。

再如在24K节目《大赛车》(F—1RACE)游戏中,背景画面被分为三部分:上部(约占屏幕的六分之一)为赛车速度、比赛时间、比赛路线及比赛进程等项的提示;中部(约占屏幕的三分之一)为远山、蓝天、白云及“HELLO”标语版背景,游戏中该部分画面随着比赛路线的弯曲而横向左卷或右卷;下部(约占屏幕的二分之一)为赛车路线、路标、田野等画面,游戏中该部分画面显现出极度扭曲的、高低不平的公路路面。该类游戏画面结构的绘制方法曾使许多人迷惑不解,尤其是公路画面的扭曲更令人感到高深莫测,仅仅16K程序能够实现如此逼真的游戏画面实在不可思议。实际上,该游戏的画面控制程序仅仅5K左右。它采用把一幅画面分为3部分单独控制即画面分割法,这也是通过设置系统软开关实现的。由此可见,任天堂游戏的画面处理方法是灵活多变的,也是异常神奇的。

③动画处理技术

组成任天堂游戏机中动画的最小单位是卡通块,每个卡通块为8×8点阵,与一个字符同样大小。卡通块也有一个图形字库,对应的PPU地址为$0000~$0FFF。每个卡通块的字模数据也由连续的16个单元组成,故一次最多可定义256个卡通块,序号依次为0~255。

6527CPU规定,在一幅画面上只允许同时显示64个8×8点阵的卡通块(这是由PPU内卡通定义区的RAM分配量决定的)。如《超级玛丽》中,玛丽在吃红蘑菇之前为16×16点阵大小(即由4个卡通块组成),当吃了红蘑菇之后身体长大一倍,变为32×32点阵(即由16个卡通块组成)的卡通。但实际游戏中要求显示的卡通块数往往远远超过这一限制,如目前较流行的打斗游戏《街霸》中,一个卡通块即为128×64点阵(由128个卡通块组成),有时还更大,这是怎么实现的呢?

原来在实际游戏中,对卡通进行了分时控制。所谓分时控制就是在不同的时间里显示卡通的不同部分,依靠人眼的视觉惰性产生连续的感觉。如《魂斗罗》游戏中的卡通显示(两个正面角色、敌人、发射的子弹、暗堡的闭合与开启都是卡通)就是每一次中断显示卡通的二分之一实现的。

卡通的定义操作极其简单,系统规定一个卡通块由连续的4个内存单元定义,第一个单元指定卡通显示的Y坐标、第二个为卡通块在字库中的序号、第三个为卡通块的显示状态(配色组合、左右翻转、上下颠倒以及显示于那个卡通页面)、第四个为显示的X坐标。编程中可任意指定定义卡通的内存页面(一般选二页或三页,即$200~$2FF、$300~$3FF)。

3.任天堂游戏的音响处理

在大部分任天堂游戏的过程始终,一直伴奏着和谐动听的背景音乐;随着游戏的进行和角色的动作还不时发出逼真的效果音响,而且这些音响的发出与背景的移动、角色的运动三者并行工作,互不干扰。许多朋友玩过中华机上的游戏,如《警察抓小偷》、《富士山决战》等,这些游戏中的音响发出与角色的动作是不能同时进行的,即角色动作时没有音响;发出音响时角色的动作要停下来。任天堂游戏中的音响处理确有独到之处,由于在6527CPU内固化可编程音响发生器,所以音响控制程序特别简洁。任天堂游戏的发声系统由5个声部组成,对应于CPU管理的$4000~$4013二十个单元,每个声部使用4个单元,它们的作用依次为音色音量、音形包络、音调细调、音调粗调。第一、二、三声部可进行和声旋律演奏,也可以选取任一声部发出效果音,如执行F BASIC程序

POKE & H4015, 1:POKE &H4000,255,255,255,255

就可发出长达三分钟的、频率由低到高的警报声。第四声部可以模仿连续不断的噪声,如风声、雨声、钟声、脚步声、火车运行声等等。第五声部则可模仿出人的讲话声。任天堂游戏中背景音乐一般都是使用前三个声部演奏的,演奏程序也是放在中断中处理的。5个声部的发声总开关由$4015控制,$4015的D0~D4位依次控制着第一至第五声部的工作状态,置0关闭、置1开启。

由以上讨论可见,“中断”在任天堂游戏中占有举足轻重的地位。也正因为任天堂游戏充分使用了中断,才使它风靡全球。

三、开发任天堂游戏的可行性

1.F BASIC的开发环境

目前,与任天堂游戏机配套的键盘以其低廉的价格已迅速推开。游戏机配上键盘和学习卡后,再加上家庭中的电视机、录音机,就构成了比较完整的低档电脑系统,使用它不仅可以进行谱曲、演奏、打字、演算、写文章、学外语;可以进入声像学习系统,使用各类教学磁带辅导教学;可以使用F BASIC语言编程,学习计算机语言;可以使用LOGO语言绘制千奇百怪的图案;还可以使用它开发任天堂游戏。但是,由于这类键盘无监控系统,在F BASIC系统下编写机器语言程序,修改和调试都不方便。因此极难编写出满意的程序。另外,由于学习卡中的字模已经固定,只能使用给定的卡通,因此也极难编出具有新意的游戏。所以,键盘只能称为低档的游戏开发工具。

2.高层次的开发环境

高层次的开发环境要借助PC机才能实现。如北京裕兴机械电子研究所开发的“V1.0游戏开发系统”,可以直接运行128K以下的各种任天堂游戏软件,具有比PC机的DEBUG更强的编辑功能,可以汇编、反汇编6527机器语言程序。因此,使用这一系统开发任天堂游戏软件当然得心应手,调试极为方便。但是这种系统一次性投资较大,一般业余爱好者较难接受。其次是使用中华学习机的开发环境,但是这种开发环境仅能在中华学习机上开发软件而不能直接运行(必须把程序装入万用卡中、再插入游戏机才能运行),故程序的调试不大方便。另外,它只能使用中华机的$2000~$5FFF地址单元编写程序,编程地址与游戏的实际工作地址不对应,故对初学者来说,较难适应。已有一种编程器,能从某些游戏卡中读出机器码和把游戏程序写入EPROM中,但由于不具备汇编、反汇编功能,满屏的机器码,编写和调试程序不很方便。

综上所述,目前国内尚无适应业余爱好者的游戏开发系统。因此,亟待国内同仁共同努力,使价廉物美的开发系统早日问世。 —完— (于春)