任天堂游戏编程探密2
隶L-L_.\
2占,寻l
二,任天堂游戏的软件特点:
1.任天堂游戏的软件结构
于春
-——,
存储器)存储当前使用的字模.
任天堂游戏软件结构可分为两大类:基本结构和
扩展结构.
?基本结构
基本的任天堂游戏软件容量为40K字节(标准卡
标注为LB).典型游戏如:《1942》,《超级玛丽》等.其
中32K字节为游戏控制程序,供CPU执行f8K字节
为图形字模,由PPU处理.另外还有一种低配置结
构,软件容量为24K字节(标注为LA),这是一种早期
软件.其中控制程序为16K字节;字模为8K字节.典
型游戏有:《火箭车》,《马戏团》等.
40K软件的控制程序存放地址在CPU管理的
$8000,$FFFF空间;字模地址在PPU管理的
$0000~$IFFF空间.16K软件的控制程序存放地
址为$CO00,$FFFF;字模地址也是$0000,
$IFFF.
?扩展结构
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;最后一个存储体(称
为HOMEBANK)映射于$C000~$FFFF.典型游
戏有《魔界村》,《怒》,(1943),(1944~,《特殊部队》等.
这类游戏卡中一般都配有一块8K的RAM(动态随机
?
28(总156)?
160K卡(标注为LG),其程序部分为80K;字模
部分为80K.典型游戏有《冒险岛I》,《花式撞球》,《欢
乐叮当》等.
256K卡(标注为LH),其程序部分为128K;字模
部分为128K.典型游戏有《柯拉米世界》,《恶魔城》等.
另外,还有《魂斗罗》,《赤色要塞》,《绿色兵团》,《立体
篮球》等256K游戏被压缩为128K游戏,目前这类游戏
的256K版已不多见,常见的均为128K的压缩版.
对于任天堂系列游戏机,由于CPU的处理速度,
画面的解析度,音域音色等方面的限制,即使软件容量
再增大,游戏效果也不会提高多少,总达不到街机的水
平,故单个游戏的最大容量一般为256K,目前尚未见
到更大容量的游戏软件.
?存储体的切换
对每一个游戏芯片来说,都有两类地址:绝对地址
(通常称为逻辑地址)和相对地址(通常称为程序地
址).如32K芯片的逻辑地址为0000H~7FFFH,其程
序地址则为8000H~FFFFH;再如128K芯片的逻辑
地址为0000H,1FFFFH,而其程序地址仍为
8000H~FFFFH,这是通过8个存储体空间的分段切
换实现的,关于各存储体的切换控制一般是通过一块
74LS161(可预置四位二进制计数器)门电路实现的.
切换电路原理图如图l所示.
关于前7个存储体的切换控制程序则放在第8存
储体的C000H~FFFFH地址中,程序形式如下:
PH’A
LDA#$ON
STA$FFFF
PLA
JMP$XXXX
其中”N”为切换数据,即存储体的段号;”XXXX”为欲
转往该存储体程序的地址.’
对照图1可明显看出IC1的各段逻辑地址与切换
数据的对应关系如下页中附表所示.
?多节目合卡
随着大规模集成电路制造工艺的完善和提高,高
容量只读存储器制造成本迅速下降,极大地缩小了1
兆位芯片与8兆位芯片间的价格差距,因而多节目高
K合卡应运而生,出现了8合1,16合1,32合1等多
《无线电》
节目合卡.这些合卡尽管容量不同,但其节目切换原
理与图l的段址切换方式是大同小异的,不同的仅是
每段的切换容量根据节目容量的大小从16K128K
不等,不多赘述.
2.任天堂游戏的疆徽处理方法…
?屏幕显示原理.
任天堂游戏机的中CPU虽然仍属65系列的
CPU,但它的显示方式与中华学习机截然不同.其显
示屏幕由三类四层显示页面构成.三类显示页依次
为:卡通(角色或动画)页,背景页,底背景页.卡通页
用于显示游戏中的角色,它有两个页面:卡通零页——
使角度显示于背景之前}卡通一页——使角度显示于
背景之后.卡通页的显示分辨率为256×240点,卡通
可以以点为单位移动.背景页主要用于游戏画面的显
示,它共有4个显示页面,每页的两边互相连接并排成
“田”字,采取字符显示方式,显示分辨率为32列×3O
行,每幅画面为960个图形块构成,游戏中可任取一个
页面显示.底背景页主要用于大面积的单色显示,以
衬托出蓝天,草地,沙漠,大海等效果,显示分辨率为
l×l.四层显示页的排列由前向后依次为:卡通零页,
背景页,卡通一页,底背景页(见图2).系统默认的排
列方式为背景00页与卡通页,底背景页四层页面重
叠,前面显示页的内容可以遮住后面显示页的内容,因
而很容易构成具有一定景深次序的立体画面.
?背景处理技术
任天堂游戏中的背景画面显示采用字符方式,每
个字符通常称为背景图形块.每个图形块为8×8点
阵,其字模数据存放在由PPU管理的一段内存中,称
为背景字库,一般使用$i000~$1FFF地址,共4K
字节.每个字模由连续的l6个单元组成,故一次最多
可定义256个字符,序号依次为0~255.显示字符时,
只要把字符序号置入屏幕对应的显示单元中即可.
任天堂游戏中的背景处理由PPU独立完成,每
一
个背景页面对应PPU的1024个单元,为顺序对应
VCC32
PGM31
NC30
A1429
A1328
A827
A926
A1125
oE24
A1023
CE22
D721
D620
D519
D418
D317
IC1271000
1994年第3期
一
0—
1CLEARVCC16
2CK15
3AQA14
4BQB13
5CQC12
6DQD11
7PT10
8VSSLoAD9
IC2
74LS161
?
关系.背景00页对应PPU地址为$2000~$23FF,
其中$2000~$23BF对应于960个图形显示单元,
$23C0~$23FF为该显示页的配色单元;背景i0页
对应的pPU地址为$24oQ,$27FF~同样,后面的两
一
页依次对应$2800~$2BFF$2Coo~$2FFF.由于
游戏机中只有一块2K的VRAM(PPU使用的
RAM)故一般只使用前两个页面,通常称其为背景零
页和背景一页.游戏中可通过设置软开关的方法控制
画面的横,纵向,以使两幅画面横向并列或纵向衔接.
在实际游戏中,要经常用到背景画面的横向卷动
和纵向滚动.如《魂斗罗》游戏中的第一,五,六,七,八
关是横向卷动,第三关则是纵向滚动.这些画面位移效
果是如何实现的呢?我们知道,中华学习机中的画面位
移是通过反复改写显示映射单元的内容而实现的,这
种方法处理速度慢,控制程序冗长.任天堂则采取了截
然不同的方法.它通过硬件的特殊处理,引入了显示窗
口的概念.画面位移时,每个显示单元的内容不变,而
令显示窗口向相反的方向移动,从而实现了画面的横
向卷动和纵向滚动.如《魂斗罗》中第一关横向卷动的
控制方法是:令两个背景页横向衔接,游戏开始时,背
景零页绘满32列,而背景一页仅绘制12歹1}显示窗
口对正零页;当游戏中的角色前进到画面右边的一定
位置时,则令显示窗口右移一格,同时绘制一页的第
l3列;这样,显示窗口每右移一格,画面绘制一列,从
而使游戏画面连绵不绝;每移出一页画面(32列)令页
数计数器加一,当累计到一定页数时则令窗口不再移
动,进行关底处理.这一画面的位移控制极为简单,仅
通过向位移软开关$2005置入移位数据就可实现.
FBASlC的控制程序为:
10POKE&H2005.X
20POKE&H2005.0
D2DlDOAl6Al5A14逻辑地址
OOOOOOO?O,3唧
OOlOOl4OOO,7FFF
OlOOlO8000~BFFF
OllOllCOOO,FFFF
lOOlOOlOO?,l3FFF
l0ll0l14OOO,l7FI
llOll0l8OOO,lBFFF
lllllllCOOO,l瞪冒
652S”觚觚舢肋啪苎}
?23456789
n???
x为位移参数.其机器语言的控制程序为:
LDAX
STA$2005
LDA#$OO
STA$2005
画面的纵向位移则更为简单,如《魂斗罗》的第三关
——
瀑布天险是一个纵版画面,角色要从最底层跳升
到最顶层与关底魔头决斗,游戏进程中画面随着角色
的跳跃不停上滚.实际上这一位移过程是在一页画面
中进行的,控制方法是:每当角色前进到画面上方某一
位置时,改写画面最底行的图形数据,使其为即将移入
画面的一行I然后令显示窗口向上移一格t由于窗口是
在一个显示页上移动,故最底行即是最顶行(这时可把
一
页画面理解为上,下边对接的圆筒,显示窗口是套在
画面圆筒外面稍大的一个圆筒,窗口移动一格就是向
上旋转一格).FBASIC控制程序为:
1OPoKE&H2005,0
2OP0KE&H2005,Y
Y为位移参数.相应的机器语言程序为:
LDA#$OO
STA$2005
LDAY
STA$2005
以上画面的送数,位移操作都是在CPU响应非
屏蔽中断期间完成的(非屏蔽中断是在电视机的场回
扫期间发出和响应的,这时的电视屏幕是黑的),所以
我们感觉不到位移的痕迹.
再如在24K节目《大赛车》(F一1RACE)游戏中,
背景画面被分为三部分:上部(约占屏幕的六分之一)
为赛车速度,比赛时间,比赛路线及比赛进程等项的提
示t中部(约占屏幕的三分之一)为远山,蓝天,白云及
“HELLO”标语版背景,游戏中该部分画面随着比赛路
线的弯曲而横向左卷或右卷t下部(约占屏幕的二分之
一
)为赛车路线,路标,田野等画面,游戏中该部分画面
显现出极度扭曲的,高低不平的公路路面.该类游戏
画面结构的绘制方法曾使许多人迷惑不解,尤其是公
路画面的扭曲更令人感到高深莫测,仅仅16K程序能
够实现如此逼真的游戏画面实在不可思议.实际上,
该游戏的画面控制程序仅仅5K左右.它采用把一幅
画面分为3部分单独控制即画面分割法,这也是通过
设置系统软开关实现的.由此可见,任天堂游戏的画
面处理方法是灵活多变的,也是异常神奇的.
?动画处理技术
组成任天堂游戏机中动画的最小单位是卡通块,
每个卡通块为8×8点阵,与一个字符同样大小.卡通
块也有一个图形字库,对应的PPU地址为$0000~
$0FFF.每个卡通块的字模数据也由连续的16个单
?30(总158)?
元组成,故一次最多可定义256个卡通块,序号依次为
O,255.
6527CPU规定,在一幅画面上只允许同时显示
64个8×8点阵的卡通块(这是由PPU内卡通定义区
的RAM分配量决定的).如《超级玛丽》中,玛丽在吃
红蘑菇之前为16×16点阵大小(即由4个卡通块组
成),当吃了红蘑菇之后身体长大一倍,变为32×32点
阵(即由16个卡通块组成)的卡通.但实际游戏中要求
显示的卡通块数往往远远超过这一限制,如目前较流
行的打斗游戏《街霸》中,一个卡通块即为128×64点
阵(由128个卡通块组成),有时还更大,这是怎么实现
的呢?
原来在实际游戏中,对卡通进行了分时控制.所谓
分时控制就是在不同的时间里显示卡通的不同部分,
依靠人眼的视觉惰性产生连续的感觉.如《魂斗罗》游
戏中的卡通显示(两个正面角色,敌人,发射的子弹,暗
堡的闭合与开启都是卡通)就是每一次中断显示卡通
的二分之一实现的.
卡通的定义操作极其简单,系统规定一个卡通块
由连续的4个内存单元定义,第一个单元指定卡通显
示的Y坐标,第二个为卡通块在字库中的序号,第三
个为卡通块的显示状态(配色组合,左右翻转,上下颠
倒以及显示于那个卡通页面),第四个为显示的X坐
标.编程中可任意指定定义卡通的内存页面(一般选二
页或三页,即$200,$2FF,$300,$3FF).
3.任天堂游戏的音响处理
在大部分任天堂游戏的过程始终,一直伴奏着和
谐动听的背景音乐t随着游戏的进行和角色的动作还
不时发出逼真的效果音响,而且这些音响的发出与背
景的移动,角色的运动三者并行工作,互不干扰.许多
朋友玩过中华机上的游戏,如《警察抓小偷》,《富士山
决战》等,这些游戏中的音响发出与角色的动作是不能
同时进行的,即角色动作时没有音响;发出音响时角色
的动作要停下来.任天堂游戏中的音响处理确有独到
之处,由于在6527CPU内固化可编程音响发生器,所
以音响控制程序特别简洁.任天堂游戏的发声系统由
5个声部组成,对应于CPU管理的$4000~$4013
二十个单元,每个声部使用4个单元,它们的作用依次
为音色音量,音形包络,音调细调,音调粗调.第一,二,
三声部可进行和声旋律演奏,也可以选取任一声部发
出效果音,如执行FBASIC程序
POKE&H4015,1:POKE&H4000.255,
255,255,255/
就可发出长达三分钟的,频率由低到高的警报声.第四
声部可以模仿连续不断的噪声,如风声,雨声,钟声,脚
步声,火车运行声等等.第五声部则可模仿出人的讲话
声.任天堂游戏中背景音乐一般都是使用前三个声部
《无线电》
争?争?争争?夺’争’争争’争’争’争’争’争’争’争’争’争’争’争’夺
:微机开关电源维修几例;
毒毒
夺?争?争?争?牛?f}?争?+?黄金华:一}’??+?丰?牛’争’孛一
例一,故障现象:BSP一002A开关电源不能启动
计算机,且风扇不转.
检查与
:在机上测N5伏输出端电压为2伏,I2
伏输出端电压为4.6ft.测得脉宽调制组件KA7500的
3脚电压为零伏,4脚电压为4.I伏.当将开关电源与微
机断开,在5伏电压输出端接3欧假负载时,风扇转动,
各输出端电压正常I将假负载改为68,风扇微动一下,
各输出端电压微低.在IM339的1O脚与地之间跨接
220t*F/26V电容,负载仍为6欧,风扇转4,5转即停.
将”缺相”保护电路中接十5ft端的电阻R52由760欧改
为850欧,一切工作正常.
故障原因:在低负载时,电源5伏输出端电压稍高,
使”缺相”保护电路取样端电压上升,保护电路动作,造
成故障.
例二,故障现象:ML200W开关电源,有时不能启
动计算机.
检查与分析:将开关电源改用调压器供电,调节输
出电压为I80伏时,”电源好(PG)”信号为零伏,其它各
电源输出端正常.将市电取样回路中的R45由3.9千欧
改为4.3千欧,这样输入电压降至155伏时微机能正常
工作.
.
故障原因:微机有时不能启动,是市电电压过低,
“PG”信号为零伏.
例三,故障现象:开关电源输出电压随输入电压变
动.
检查与分析:调节输入电压分别为I75伏,200伏和
220伏时,5伏输出端电压分别为3.7伏,4.6{k和5伏,再
升高输入电源,5伏电压不变.在上述条件下,脉宽调制
组件TL494的3脚电压在0.I,0.2伏之间(正常时应
随电压升高逐渐上升);用示波器观察TL494的8脚和
II脚波形不随输入电压变化而变动(正常时,输入电压
下降,脉冲加宽),换一片TL494,故障消除.
故障原因:脉宽调制组件TL494的采样放大器功
能失效,不能随取样端电压变化调节脉冲宽度.
例四,故障现象:不能启动计算机,但风扇转动.
检查与分析:测士50t和士12伏电压正常,”电源好
(PG)”信号为零伏.测比较器LM339的4脚电压为2伏
(反相输入端),5脚电压为2.5it(同相输入端),输出端
2脚电压为0.2伏(正常时应为5伏),表明该比较器有故
障.由于该比较器输出电压加到由6脚,7脚和I脚组成
的另一个比较器的同相端,使输出端I脚电压为零伏,
即PG信号为零伏.改用该机LM339未用的一个比较
器替换有故障比较器,故障消除.
故障原因:负责产生PG信号的比较器失效.
演奏的,演奏程序也是放在中断中处理的.5个声部的
发声总开关由$4015控制,$4015的D0~D4位依次
控制着第一至第五声部的工作状态,置0关闭,置I开
启.
由以上讨论可见,”中断”在任天堂游戏中占有举
足轻重的地位.也正因为任天堂游戏充分使用了中
断,才使它风靡全球.
三,开发任天堂游戏的可行性
I.FBASIC的开发环境
目前,与任天堂游戏机配套的键盘以其低廉的价
格已迅速推开.游戏机配上键盘和学习卡后,再加上
家庭中的电视机,录音机,就构成了比较完整的低档电
脑系统,使用它不仅可以进行谱曲,演奏,打字,演算,
写文章,学外语I可以进入声像学习系统,使用各类教
学磁带辅导教学;可以使用FBASIC语言编程,学习
计算机语言;可以使用LOGO语言绘制千奇百怪的图
案I还可以使用它开发任天堂游戏.但是,由于这类键
盘无监控系统,在FBASIC系统下编写机器语言程
序,修改和调试都不方便.因此极难编写出满意的程
序.另外,由于学习卡中的字模已经固定,只能使用给
定的卡通,因此也极难编出具有新意的游戏.所以,键
1994年第3期
盘只能称为低档的游戏开发工具.
2.高层次的开发环境
高层次的开发环境要借助PC机才能实现.如北
京裕兴机械电子研究所开发的”VI.0游戏开发系统”,
可以直接运行I28K以下的各种任天堂游戏软件,具
有比PC机的DEBUG更强的编辑功能,可以汇编,反
汇编6527机器语言程序.因此,使用这一系统开发任
天堂游戏软件当然得心应手,调试极为方便.但是这种
系统一次性投资较大,一般业余爱好者较难接受.其次
是使用中华学习机的开发环境,但是这种开发环境仅
能在中华学习机上开发软件而不能直接运行(必须把
程序装入万用卡中,再插入游戏机才能运行),故程序
的调试不大方便.另外,它只能使用中华机的$2000~
$5FFF地址单元编写程序,编程地址与游戏的实际
工作地址不对应,故对初学者来说,较难适应.已有一
种编程器,能从某些游戏卡中读出机器码和把游戏程
序写入EPROM中,但由于不具备汇编,反汇编功能,
满屏的机器码,编写和调试程序不很方便.
综上所述,目前国内尚无适应业余爱好者的游戏
开发系统.因此,亟待国内同仁共同努力,使价廉物美
的开发系统早日问世.一完一
?31(总159)?