1. 当年的Fc《魂斗罗》《玛丽》是用什么工具做的。如何反编译。
汇编和c都可以,这里有个编程器http://pocket.92wy.com/fc_info_33534.html
任夭堂游戏编程探密(文字版)
第一章 任天堂游戏结构概论
长期以来,由于任天堂公司在技术上的封锁和国内游戏开发工具的久缺.任天堂游戏
蒙上了一层神密的面纱,中国人只能玩任天堂游戏.而不能象苹果机、中华学习机那样了解
游戏程序、自己动手编写游戏。近年来,随着任夭堂系列游戏机配套键盘的问世,逐步创造了
揭开这层面纱的条件.特别是配有打印机接口的“裕兴”、“金字塔”等高档游戏机键盘的陆续
推出,用户仅仅编写一个简单的反汇编程序就可打印出系统软件的源程序,从而为探索任天
堂游戏软件的奥秘提供了有效的手段。
有人疑问任夭堂游戏机的中央处理器同中华学习机一样也是八位的CPU.但为什么
它能够产生出如此绚丽多彩的动画、美妙动听的音响、栩栩如生的角色,其效果远远胜过美
国的“雅达利“,更强过中华学习机的游戏呢?究其原因,关键在于任天堂游戏机的设计者们
在传统的八位机上独具匠心、另辟蹊径,从硬件上进行了独创的改造,在软件上进行了大胆
的尝试,使一个CPU发挥了两个CPU的功效,产生了绝妙非凡的艺术效果.从而以物美价
廉的绝对优势迅速占领了游戏机市场,掀起了家庭娱乐领域的第三次浪潮。本文拟从分析任
天堂游戏的软、硬件特点出发,揭开任天堂游戏编程的秘密.以一与广大同好切磋。
1·1 任天堂游戏机的硬件特点
1·1·1电路原理框图
任天堂游戏机的硬件共分两部分:主要部分是游戏机.从属部分是游戏卡。游戏机提供
游戏的运行环境,游戏卡提供支持游戏的软件,其电路原理框图如图1一1。
上图中6527 CPU为中央处理器,田于它的任务是处理程序,所以一般把与它相连的部
件加以前缀"P".故CPU的地址总线表示为PADD,数据总线表示为PDATA,CPU管理的
存储器表示为PRAM,PROM等。同样.6528 PPU的任务是处理图像,所以凡与它相关的部
件均加以前缀“V”。
1·1·2 中央处理器6527 CPU
1.CPU的内部结构
6527 CPU是一个八位单片机,在它的内部除固化有6502系列的CPU外,还有一个
可编程音响发生器PSG(Programable Sound Generator)和24个八位只写寄存器,其地址空
间分配为$4000-$4017.主要用于CPU的I/O操作,PSG音响发生器的工作就是由这些
寄存器控制完成的.
1·1·4 游戏卡
1、游戏卡的基本组成
普通的单节目游戏卡一般由两片ROM或EPROM组成,ROM的容量由游戏程序量的
大小决定.最简单的任天堂游戏为24K,故这种卡内有块16K的ROM存放程序,一块
8K的ROM存图形字模(目前有软封装的IC,它把两块ROM封在一起)。典型的任天堂
游戏程序量为40K,它使用一块32K的ROM存程序、一块8K的ROM存字模。当程序量大
于40K时则要对ROM进行容量扩充.
2、游戏卡各脚的功能
游戏卡是一60脚的接插件,各脚功能见图1一4。
3、常用 ROM引脚功能简介
游戏卡中常用ROM或EPROM的型号有27C64(8 X 8K)、27C128(8X l6K)、27C256(8
X 32K), 27C512 (8 X 64 K ), 27C1000 (8 X 128K),或后缀数字相同而前缀不同的其它公
司产品,盒卡中还有2兆位(8 x 256K)至8兆位(8X 1000K)的芯片。其中27C64~27C512为28
脚的芯片,27C1000或更大容量的芯片为32脚(个别的27C1000仍为28脚,它使用了OE.
CE中的一个脚作为地址线).
1·2 任夭堂游戏软件的特点
目前流行的任夭堂游戏软件有数百种,内容已涉及及到政治、经济、军事、战争、教育、管
理、体育、娱乐等各个领域.可以说任天堂游戏已兼顾了男、女、老、中、青、少、幼各个年龄阶
层,深受世界各国人民所喜爱。也许这就是它迅速普及的主要原因。但是,任天堂游戏尽管
内容千变万化、情节各异,其软件结构和处理方法则是基本相同的,它们有着共同的特点。
1·2·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,分两个8K存储体.
典型游戏有《七宝奇谋》、《影子传说》等。
通常把24k-48K容量的游戏卡称为低档卡或低档游戏。
对于64K卡(标注为LD)有两种结构:一种是其程序部分为32K;字模部分为32x,分
为四个8K存储体.典型游戏有《迷宫组曲》,《智慧城》、《沙罗曼蛇一代》、《北斗神拳一代》
等;第二种则是程序与字模共用64k,分为四个存储体.典型游戏有《米老鼠大冒险》、《冒险
岛》、《俄罗斯方块1、2》等。
80K的游戏不多(标注为LE),常见的有《中国拳》、《金牌玛丽》等。其程序部分为48K,
前32K分为两个16k存储体;字模部分为32k,分为四个8k存储体。
通常称64k、80K的游戏为中档卡。
对于128K卡(标注为LF),其程序部分与字模部分棍合共用128k,分为八个16K存储
体,其中前七个存储体地址映射于$8000-$BFFF:最后一个存储体(称为HOME BANK)
映射于$0000一$FFFF,典型游戏有《魔界村》、《怒》、《火之鸟方》、《未来战士》、《洛克人》、
《1943》 《1944 》《嵌特殊部队》、《冲撞霹雳机车》等。
这类游戏卡中一般都配有一块8K的RAM(动态随机存储器〕存储当前使用的字模。
对于160k卡(标注为LG),其程序部分为128K;字模部分为32K。典型游戏有《倚天屠
龙记》、《立体大赛车》、《欢乐叮当》等。
对于256K卡(标注为LH),其程序部分为128K;字模部分为128K。典型游戏有《柯拉
米世界》、《恶魔城》、《双截龙》、《松鼠历险记》《人间兵器》、《联合大作战)等。另外,还有《魂
斗罗》、《赤色要塞》、《绿色兵团》、《立体篮球》《荒野大镖客》等256K游戏被压缩为128K游
戏,目前这类游戏的256K版已不多见,常见的均为128K的压缩版;
通常称128K一256K容量的游戏为高档卡或强卡。
对于高于256K容是的游戏则称为特卡,如《不动明王传》,《战斧》、《孔雀王》,《大旋风》
等游戏容量已达2M-4M。但由于任天堂系列游戏机的CPU的处理速度、画面的分辨率、音
域音色等方面的限制,即使软件容量再增大,游戏效果也不会提高多少.总达不到街机的水
平,故目前单个游戏的容量大于256K的尚不多见。
1·3 任天堂游戏的图像处理方法
本节简要介绍任天堂游戏的图像处理方法。
1·3·1屏幕显示原理
任天堂游戏机中的CPU虽然仍属65系列的CPU,但它的显示方式与中华学习机截然
不同。其显示屏幕由三类四层显示页面钩成。三类显示页依次为:卡通(角色或动画)页、背
景页、底背景页。卡通页用于显示游戏中的角色,它有两个页面:卡通零页——使角色显示于
背景之前;卡通一页——使角色显示于背景之后。卡通员的显示分辨率为256x240点,卡通
可以点为单位移动。背景页主要用于游戏画面的显示,它共有四个显示页面,每页的两边互
相相连并排成“田”字,采取字符显示方式,显示分辨率为32列* 30行,每幅画面由$60个
图形块构成,游戏中可任取一个页面显示。底背景页主要用于大面积的单色显示,以衬托出
兰天、草地、沙漠、大海等效果,显示分辨率为1x1。 四层显示页的排列由前向后依次为:卡
通零页、背景页、卡通一页、底背景页(见图1一6)。系统默认的排列方式为背景00页与卡通
贾、底背景页四层页面重叠,前面显示页的内容可以遮住后面显示页的内容,因而很容易构
成具有一定景深次序的立体画面。
1·3·2背景处理技术
任天堂游戏中的背景画面显示采用字符方式,每个字符通常称为背景图形块。每个图
形块为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的控制程序为:
POKE &H2005,x:POKE &H2005,0
x为位移参数。其机器语言的控制程序为:
LDA x
STA $ 2005
LDA #$00
STA $ 2005
画面的纵向位移则更为简单,如《魂斗罗》的第三关——瀑布天险是一个纵版画面,角色要从
最底层跳升到最顶层与关底魔头决斗,游戏进程中画面随看角色的跳跃不停的上滚。实际--
这一位移过程是在一页面面中进行的,控制方法是,每当角色前进到画面上方某一位置时,
改写画面最底行的图形数据,使其为即将移入画面的一行.然后令显示窗口向上移一格,由
于窗口是在一个显示页上移动,故最底行即是最顶行(这时可把一页面面理解为上、下边连
接的圆筒,显示窗口是套在画面圆筒外面稍大的一个圆筒,窗口移动一格就是向上旋转一
格)。F BASIC控制程序为,
POKE &H2005,0:POKE &H2005,Y
Y为位移参数。相应的机器语言程序为,
LDA #$00
STA $2005
LDA Y
STA $2005
以上画面的送效、位移操作都是在CPU响应非屏蔽中断期间完成的(非屏蔽中断是在
电视机的场回扫期间发出和响应的,这时的电视屏是黑的),所以我们感觉布道位移的痕迹。
关于任天堂游戏中背景画面的绘制 移动及画面的分裂位移和扭曲等效果的实现,将在第六章详细讨论。
1·3·3动画处理技术
组成任天堂游戏中动画的最小单位是卡通块,每个卡通块为8X8点阵.与一个字符同
样大小。卡通块也有一个图形字库,对应的PPU地址为$0000-$OFFF。每个个卡通块的字
模数据也由连续的16个单元组成,故一次最多可定义256个卡通块,序号依次为0-255
6527CPU规定.在一幅画面上只允许同时显示64个8x8点阵的卡通块〔这是由PPU
内卡通定义区的RAM分配决定的〕,如《超级玛丽》中,玛丽在吃红蘑菇之前为16x16点
阵大小(即由4个卡通块组成),当吃了红蘑菇之后身体长大一倍,变为32X 32点阵(即由
16个卡通块组成〕的卡通。但实际游戏中要求显示的卡通块数往往远远超过这一限制,如目
前较流行的打斗游戏《街霸》中,一个卡通即为128*64点阵(由128个卡通块组成)有时还
更大,这是怎么实现的呢?
原来在实际游戏中,对卡通进行了分时控制。所谓分时控制就是在不同的时间里显示半
通的不同部分,依靠人眼的视觉惰性产生连续的感觉。如《魂斗罗》游戏中的卡通显示(两个
正面角色、敌人、发射的子弹、暗堡的闭合与开启都是卡通)就是每一次中断显示卡通的二分
之一实现的。
卡通的定义操作极其简单,系统规定一个卡通块由连续的四个内存单元定义,第一寸
单元指定卡通显示的Y坐标、第二个为卡通块在字库中的序号、第三个为卡通块的显示状
态〔配色组合、左右翻转、上下颠倒以及显示于那个卡通页面,,第四个为显示的X坐标。编
程中可任意指定定义卡通的内存页面(一般选二页或三页,即$200一$2FF, $300
$3FF)。
关于任天堂游戏中的卡通的定义及运动控制将在第七章讨论。
1·4 任天堂游戏的音响处理
在大部分任天堂游戏的过程始、终,一直伴奏着和谐动听的背景音乐;随岩游戏的进行
和角色的动作还不时发出逼真的效果音响,而且这些音响的发出与背景的移动、角色的运动
三者并行工作,互不干扰,许多朋友玩过中华机上的游戏,如《警察抓小偷》《富士山决战》
等,这些游戏中的音响发出与角色的动作是不能同时进行的,即角色动作时没有音响;发出
音响时角色的动作要停下来.任天堂游戏中的音响处理确有独到之处.由于在6527 CPU内
固化有可编程音响发生器,所以音响控制程序特别简洁,任天堂游戏的发声系统由五个声部
组成,对应于CPU管理的$40DO——$4013二十个单元,每个声部使用四个单元,它们的作
用依次为音色音量、音形包络、音调细调、音调粗调。第一、二、三声部可进行和声旋律演奏,
也可以选取任一声部发出效果音,如执行F BASIC程序
POKE &H4015,1:POKE &H4000. 255,255,255,255
就可发出长达三分钟的频率由低到高的警报声。第四声部可以模仿连续不断的噪声,如风
声 雨声 钟生 脚步声 火车声等等 第五声部则可模仿出人的讲话声。任天堂游戏中
背景音乐一般都是使用前三个声部演奏的,演奏程序也是放在中断中处理的.五个声部的发
声总开关由$4015控制,$4015的D0——D4位依次控制翻第一至第五声部的工作状态,置
0关闭、置1开启。
2. excel公式编译,在有三个随机变量的情况下,怎么保证计算结果控制在一个范围内。
不是已经答过了吗?!
在A1中输入以下公式
=MEDIAN(3.5,(B1-C1)/D1*100,4.5)
下拉填充。
3. android surfaceview视频播放如何让视频翻转90
《android逆向视频》网络网盘资源免费下载
链接:https://pan..com/s/1W1NAE-AeKbz0bb6E4mdXfA
4. c++(随机数问题),visual studio上编译的
1、Error 2 error C4700: uninitialized local variable 'm'
变量'm' 为初始化,直接用会导致程序崩溃,版本低一点的visual studio这个应该只是个警告。
2、Warning 1 warning C4244: '=' : conversion from 'time_t' to 'int', possible loss of data
这个只是个警告,意思是说转换的时候会导致数据丢失,若你确认这个对你的数据没有什么影响,可以不用理会。
5. vcs怎么编译产生随机激励的systemverilog语句
pspice,可以对众多元器件构成的电路进行仿真分析,这些元器件以符号、模型和封装三种形式分别存放在扩展名为slb、lib和plb三种类型的库文件中。*.slb库中的元器件符号用于绘制电路图;*.lib库中的元器件模型用于电路仿真分析;*.plb库中的元器件封装形式用于绘制印刷电路板的版图
Protel包含了电原理图绘制、模拟电路与数字电路混合信号仿真、多层印制电路板设计(包含印制电路板自动布线)、可编程逻辑器件设计、图表生成、电子表格生成、支持宏操作等功能,并具有Client/Server (客户/服务器)体系结构,同时还兼容一些其它设计软件的文件格式,如ORCAD,PSPICE,EXCEL等,亦可做PCB板,
Proteus(海神)的ISIS是一款Labcenter出品的电路分析实物仿真系统,可仿真各种电路和IC,并支持单片机,元件库齐全,使用方便
高频仿真是MATLAB
6. 正太分布的随机数 程序清单 这怎样才能用C编译出来呢需要怎么改编这个C++程序 求指教啊
public class RegisterAction extends BaseAction
{
private static final long serialVersionUID = 1L;
private transient Logger log = LogManager.getLogger(this.getClass());
private IRegisterService registerService;
private UserBean userbean;
public String addUser()
{
JSONObject jsonObject = new JSONObject();
try
{
registerService.addUser(userbean.getUsername(), userbean.getPassword());
jsonObject.put("operflag", "success");
jsonObject.put("user",userbean);
ajaxResponseForRequest(jsonObject);
}
catch(Exception e)
{
jsonObject.put("operflag", "fasle");
ajaxResponseForRequest(jsonObject);
}
return null;
}
public String checkName()
{
JSONObject jsonObject = new JSONObject();
try
{
// HttpServletRequest request = this.getRequest();
// String referer = request.getHeader("Referer");
// if (StringUtils.isNotBlank(referer)
// && referer.indexOf("marketingmgr/bl_imdection/queryActivityInfo.action") == -1)
// {
// log.error("Referer=" + referer + ",跨站点请求伪造");
// jsonObject.put("operFlag", "false");
// ajaxResponseForRequest(jsonObject);
// }
// else
// {
if (StringUtils.isNotBlank(userbean.getUsername()))
{
userbean.setUsername(URLDecoder.decode(userbean.getUsername(),"utf-8"));
}
int count = registerService.queryUser(userbean);
jsonObject.put("count", count);
jsonObject.put("operFlag","success");
ajaxResponseForRequest(jsonObject);
//}
}
catch(Exception e)
{
log.error(e);
}
return null;
}
public IRegisterService getRegisterService() {
return registerService;
}
public void setRegisterService(IRegisterService registerService) {
this.registerService = registerService;
}
public UserBean getUserbean()
{
return userbean;
}
public void setUserbean(UserBean userbean)
{
this.userbean = userbean;
}
}
7. 如何用C语言产生1~35之间的7个不同随机数(在VC++6.0里编译),非常感谢!
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//产生一个min~max之间的数,包含min,max
intrand(intmin,intmax)
{
returnrand()%(max-min+1)+min;
}
intmain()
{
srand((unsignedint)time(NULL));
//定义一个数组,存放产生的7个随机数
intnumbers[7];
for(inti=0;i<7;i++)
numbers[i]=rand(1,35);
//输出
for(inti=0;i<7;i++)
printf("%d",numbers[i]);
printf(" ");
system("pause");
return0;
}
8. 求大神!!C语言出不来呀。。。。看看怎么改 我要将名和姓随机搭配 我用VC++6.0编译的 是乱码
符合您自己的思路,我帮你改的:
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
char *fn;
char *n;
char a[][3]={"张", "王", "李", "赵"};
char b[][3]={"明", "强", "成", "国", "建"};
int i, j, k=100;
while (k)
{
i = rand()%(4);
fn=&a[i][0];
j = rand()%(5);
n=&b[j][0];
printf("%s%s\n",fn, n);
k--;
}
}
9. 求随机数 - - 编译的时候,在”Would you like to play again(y/n)”时输入y无法继续循环,直接退出
int main()
{
srand(time(NULL));
int randnumber,num;
while(1)
{
char ch;
randnumber=1+rand()%100;
f(randnumber,num);
printf("Would you like to play again(y/n)?");
scanf("%c",&ch);
if(ch!='y')break;
}
return 0;
}