首页> 中国专利> 在电视机顶盒上使用的NES模拟器的设计方法

在电视机顶盒上使用的NES模拟器的设计方法

摘要

一种在电视机顶盒上使用的NES模拟器的设计方法,包括:一、对6502cpu的指令的模拟;二、对NES核心部件PPU图形处理器的模拟;三、对图形缓冲机制的优化处理;四、对声音处理器的模拟;五、对手柄控制器的模拟;六、对NES游戏文件格式的解析。本发明的优点在于:通过普通的机顶盒来实现对NES游戏的支持,使得不同的机顶盒,只要使用本发明设计方法设计的NES模拟器,就能直接升级为一台NES游戏机,能够有效的提高用户对各种类型游戏的需求。

著录项

  • 公开/公告号CN101834977A

    专利类型发明专利

  • 公开/公告日2010-09-15

    原文格式PDF

  • 申请/专利权人 福建新大陆通信科技有限公司;

    申请/专利号CN200910112960.6

  • 发明设计人 方立;

    申请日2009-12-14

  • 分类号

  • 代理机构福州市鼓楼区京华专利事务所(普通合伙);

  • 代理人翁素华

  • 地址 350000 福建省福州市马尾区儒江西路1号

  • 入库时间 2023-12-18 00:52:30

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2017-02-01

    未缴年费专利权终止 IPC(主分类):H04N21/478 授权公告日:20111207 终止日期:20151214 申请日:20091214

    专利权的终止

  • 2011-12-07

    授权

    授权

  • 2010-11-03

    实质审查的生效 IPC(主分类):H04N5/00 申请日:20091214

    实质审查的生效

  • 2010-09-15

    公开

    公开

说明书

【技术领域】

本发明是关于一种数字电视机顶盒的应用软件,特别是指一种在电视机顶盒上使用的NES模拟器的设计方法。

【背景技术】

传统的数字电视机顶盒只有一些简单的游戏功能,比如俄罗斯方块,推箱子,贪吃蛇等,内容简单,功能单一。越来越无法满足广大的人民群众对游戏的需要。而NES游戏从80年代进入中国后,就广受大家的好评。NES是Nintendo Entertainment System的缩写,是Nintendo在20世纪80年代和20世纪90年代发售的一种用于游戏的主机,使用大型拔插式卡带进行NES游戏。由于硬件的不同,目前NES游戏只能在专用的NES主机上使用,而且一个游戏一般需要一个卡带,如果需要玩多种游戏的话就需要大量的卡带支持,为游戏爱好者带来诸多的不便。

【发明内容】

本发明所要解决的技术问题在于提供一种可以在电视机顶盒上使用的NES模拟器的设计方法。

本发明是通过以下技术方案解决上述技术问题的:一种在电视机顶盒上使用的NES模拟器的设计方法,包括下述内容:

一、对6502cpu的指令的模拟;

二、对NES核心部件PPU图形处理器的模拟;

三、对图形缓冲机制的优化处理;

四、对声音处理器的模拟;

五、对手柄控制器的模拟;以及

六、对NES游戏文件格式的解析。

所述对6502cpu的模拟包括下述步骤:

步骤1:获得6502 ROM的操作码;

步骤2:解码和执行操作码;

步骤3:执行中断:当程序中特定的指令执行时,软件中断就发生;

步骤4:读写内存;

步骤5:完成对指令的连续读取。

所述对6502cpu的模拟使用纯C语言编写来模拟6502cpu的131条不同的指令。

所述步骤4中模拟器中对读写内存的操作有两种方法:一种是得到操作码和操作码的操作数;另一种方法是当指令执行的时候读写内存。

所述对PPU图形处理器的模拟,包括:对PPU时序的模拟,包括基频、CPU主频、总扫描线数、扫描线总周期、水平扫描周期、水平空白周期、结束周期、帧周期、帧IRQ周期、帧率、帧时间的模拟;对存储图案表的实际读取方式的模拟;对命名表和命名表影象的读取方式的模拟;对属性表的读取方式的模拟;对调色板,调色板镜像,背景滚动,屏幕和动画分层操作方式的模拟;对动画和动画RAM读取和操作方式的模拟;在屏幕刷新的时候访问VRAM的操作方式和访问PPU RAM的操作方式的模拟。

所述对图形缓冲机制的优化处理,是将NES游戏运行中所输入的图像数据转换为一种通用的格式,然后在机顶盒的屏幕上表现出来,当PPU图形处理器在刷新屏幕图像时,并不是每次都从NES游戏的视频VROM中读取数据,而是在NES模拟器将NES格式的图像数据写入NES视频内存时就一次性地将数据转换成机顶盒能够识别的格式并存储在缓冲里面,这样在刷新屏幕图像时,就直接在缓冲中读取已经转换为机顶盒可以识别格式的图像数据,而缓冲数据的修改仅仅发生在NES模拟器修改视频VROM的时候。

NES模拟器的集成CPU里包含了一个4声道的声音处理器,包括4个声道为:2个方波,一个三角波和一个噪声发生通道,所述NES模拟器主要针对其中的方波和三角波的数据进行提取,通过波的叠加原理,将所有声道的波形样本数据,混合成一段波,然后通过机顶盒的音频输入驱动把相应的音频数据播放出去,所述对声音处理器的模拟的具体实现步骤为:

步骤1、首先从声音寄存器读出方波和三角波的特征值,然后通过特征值计算波的波长;

步骤2、计算波的工作循环,这就是应当重复波长多少次直至波结束,同样,这也是从声音寄存器读出;

步骤3、计算输出音量,这是从声音寄存器读出;

步骤4、沿着波向前移动并把数据写到缓冲,样本的比率决定了写入缓冲的字节数目,将CPU框架中同样数目的样本写入缓冲,在下一个框架,继续写入剩下的数据,直到完成写入所有计算的波的数据。

所述对手柄控制器的模拟是将机顶盒的遥控器的部分键值映射为NES模拟器的手柄控制器上的按键,通过模拟器把输入的遥控器码值转换为NES可以识别的格式进行处理。

所述对NES游戏文件格式的解析由2种方式构成:一种是机顶盒支持文件系统,则对NES游戏文件的读取使用文件系统的方式读取,并按照相应NES格式解析;第二种是在不支持文件系统的机顶盒上,把NES文件模拟成一个数组数据,并按照相应的NES格式解析。

本发明在电视机顶盒上使用的NES模拟器的设计方法的优点在于:通过普通的机顶盒来实现对NES游戏的支持,使的不同的机顶盒,只要使用本发明设计方法设计的NES模拟器,就能直接升级为一台NES游戏机,且NES模拟器移植方便,执行效率高,对机顶盒的硬件配置要求低。能够有效的提高用户对各种类型游戏的需求。

【具体实施方式】

本发明在电视机顶盒上使用的NES模拟器的设计方法包括:一、对6502cpu的指令的模拟;二、对NES核心部件PPU图形处理器的模拟;三、对图形缓冲机制的优化处理;四、对声音处理器的模拟;五、对手柄控制器的模拟;以及,六、对NES游戏文件格式的解析。

一、对6502cpu的模拟:在这一部分使用纯C语言编写来模拟6502的131条不同的指令,没有使用和机顶盒处理芯片相关的汇编语言来描写是为了进一步提高整个模拟器的可移植性。虽然在运行速度上纯C语言比用汇编语言编写的6502模拟器来的慢,但是可以有效快速的移植在不同的机顶盒平台(不同的机顶盒平台的Cpu类型都不相同,指令集也不相同)。同时为了弥补速度上的不足,加速指令模拟的速度,大量使用了inline函数,#define宏定义,使得其的运行速度基本达到了使用汇编语言编写效率的80%左右。

具体方式包括下述步骤:

步骤1:获得6502ROM的操作码:

执行ROM的第一件事就是获得操作码。获得CPU的指令指针(IP)指向的字节,这个字节就是操作码),依赖于操作码,可能需要获得操作数(operands)或者需要为了执行部分来保存这部分。对于6502CPU这种8位处理器(8-bit processer),获取操作码代码格式如下:。

needOpcode=pProgramROMBank[wInstructionPointer];

pProgramROMBank指向的内存段就是在一开始被读入的ENS ROM,wInstructionPointer就是说明指针(目前执行的指令的地方)。在上述的执行后,needOpcode将会以数字的方式(numeric value)保存这次的操作码。

步骤2:解码和执行操作码:

在获得了操作码byte后,需要对它解码和执行。由于要模拟的系统NES是8位的处理器,操作码中的“字”(word)只是一个指令,解码的过程只需要按字节考虑(8位bit)。

例如,对于6502Cpu中值29h是一个AND指令的表格。这样,它就立即执行AND,这也就意味着它将在操作码byte之后累加器(Accumulatorregister)与immediate value(立即值)作and运算。由于这个6502CPU的模拟器,需要在AND操作码byte之后在累加器上执行一个AND。然后需要增加IP,还有加或者减去执行那个特别指令所花去的时钟周期的数目。

下面是AND操作的代码,其他的操作和它的操作方式相同。

switch(needOpcode)

{

   case 0x29:

        byOperand1=pProgramROMBank[wInstructionPointer+1];

        A&=byOperand1;

以上是对于6502CPU中AND指令的模拟

   break;

。case xxxx:

在其他分支中,是其他操作码的处理程序,和上述方式相同,按照标准6205的指令集定义的执行命令来处理

   break;

   。

   。

}

wInstructionPointer+=wNumBytesForOpcode;

以上这行程序对6502的PC指针进行模拟。

dwCPUCycles-=dwNumCyclesForOpcode;

以上这行程序对6502的CPU的clock时钟周期进行模拟。

以此方式可以模拟整个6502CPU 131指令。

步骤3:执行中断:

当程序中特定的指令执行时,软件中断就发生。在NES模拟器的6502CPU中使用BRK指令执行中断。

当中断发生时,NES模拟器保存指令指针和标志寄存器(Flag register),然后在特定的内存区域内查找一个新的值赋给指令指针。每个终端都有它们被指派的地址,所以NES模拟器从那个位置获得值然后赋给指令指针。然后程序从这个点继续执行。NES模拟器的6502CPU有三种中断。指令指针的新的值依赖于中断发生的内存地址。

FFFAh=NMI(VBlank)

FFFCh=RESET

FFFEh=IRQ/BRK(software)

因此在模拟NES中断是当VBlakn发生时,CPU将:

1)将指令指针当前值推入栈。

2)将标志寄存器当前值推入栈。

3)获得位于FFFAh字的值然后拷贝到指令指针。

具体如下所示:

++PC;

PUSHW(PC);

SETF(FLAG_B);

PUSH(F);

SETF(FLAG_I);

其中PUSHW,PUSH是值推入栈的操作,SETF为设置Cpu的寄存器标志位,PC为CPU的指令计数器。

步骤4:读写内存:

关于模拟器中对读写内存的操作有两种方法。一种是得到操作码和操作码的操作数(读内存的简单方法,在这个过程中没有什么模拟行为)。另一种方法是当指令执行的时候读写内存(这个是模拟器模拟的重点),在NES的6502CPU中能够读写的指令为LDA(读)和STA(写)。对于这些指令在模拟的过程中主要注重于读或写的地址,特定的发生时间(读写的时序)。特定的内存地址(也许是一个寄存器,内存镜像,或者其他任何系统拥有的地址)。下面举例说明读内存一个流程的方法。写内存和读内存用类似的方法。

BYTE ReadMemory(WORD wAddress)

{

   switch(wAddress)

   {

     case 0x2002:

以上是对于6502CPU中对PPU状态寄存器的读操作

    break;

case 0x2004:

以上是对于6502CPU中对sprite内存读取一个字节

     break;

case xxxx:

以上是对于6502CPU中其他寄存器,内存镜像,或者其他任何系统

拥有的地址的读取操作。

    break;。

  }

}

步骤5:完成对指令的连续读取:

本模拟器通过选择执行循环任务的时间和位置来指定整个模拟器的运行效率和速度,在绘制一个扫描线之后,在绘制一整个屏幕之后,或者即便是任何指令之后,循环任务越多,性能损失也就越多,但是准确性就会越高。如果减少循环任务,模拟器的速度就会加快但是会损失一些准确性。其中每条扫描线需要的时钟周期由如下函数表达:

   NumCyclesPerScanline=(CPUFrequency/RefreshRate)/

NumScanlinePerFrame

NumCyclesPerScanline

CPUFrequency为机顶盒芯片的频率。

RefreshRate为模拟器刷新的数率。

NumScanlinePerFrame为模拟器中每帧画面的扫描线数。

NumCyclesPerScanline为每条扫描线需要的时钟周期。

二、对PPU图形处理器的模拟,包括:对PPU时序的模拟,包括基频、CPU主频、总扫描线数、扫描线总周期、水平扫描周期、水平空白周期、结束周期、帧周期、帧IRQ周期、帧率、帧时间的模拟;对存储图案表的实际读取方式的模拟;对命名表和命名表影象的读取方式的模拟;对属性表的读取方式的模拟;对调色板,调色板镜像,背景滚动,屏幕和动画分层操作方式的模拟;对动画和动画RAM读取和操作方式的模拟;在屏幕刷新的时候访问VRAM的操作方式和访问PPU RAM的操作方式的模拟。

三、对图形缓冲机制的优化处理,由于NES的图像格式比较特殊,不能直接使用,因此模拟器的一个重要部分就是将NES游戏运行中所输入的图像数据转换为一种通用的格式,然后在机顶盒的屏幕上表现出来。图形缓冲机制的原理就在于:当PPU图形处理器在刷新屏幕图像时,并不是每次都从NES的视频VROM中读取数据,而是在NES模拟器将NES格式的图像数据写入NES视频内存时就一次性地将数据转换成机顶盒能够识别的格式并存储在缓冲里面,这样在刷新屏幕图像时,就可以直接在缓冲中读取已经转换为机顶盒可以识别格式的图像数据,而缓冲数据的修改仅仅发生在NES模拟器修改视频VROM的时候,这种操作方式的频率远远低于屏幕刷新的频率,以及大大提高整个图像绘制的效率。

四、声音处理器的模拟:NES模拟器的集成CPU里包含了一个4声道的声音处理器(2A03),为播放音乐提供准模拟的声音。包括4个声道为:2个方波,一个三角波和一个噪声发生通道,本模拟器主要针对其中的方波和三角波的数据进行提取,通过波的叠加原理,将所有声道的波形样本数据,混合成一段波,然后通过机顶盒的音频输入驱动把相应的音频数据播放出去。

这个过程中具体实现步骤为:

步骤1、首先从声音寄存器读出方波和三角波的特征值,然后通过特征值计算波的波长;

步骤2、计算波的工作循环,这就是应当重复波长多少次直至波结束,同样,这也是从声音寄存器读出;

步骤3、计算输出音量,这是从声音寄存器读出,可以认为这是波的振幅;

步骤4、沿着波向前移动并把数据写到Buffer(缓冲),样本的比率决定了写入缓冲的字节数目,将CPU框架中同样数目的样本写入缓冲,在下一个框架,继续写入剩下的数据,直到完成写入所有计算的波的数据。

五、对手柄控制器的模拟:NES支持很多种输入设备,主要有手柄,光枪、4适配器和摇杆。该NES模拟器主要针对手柄控制器的模拟,对手柄控制器的模拟,将机顶盒的遥控器的部分键值映射为NES模拟器的手柄控制器上的按键(分别为上,下,左,右,a键,b键,开始,选择等按键),通过模拟器把输入的遥控器码值转换为NES可以识别的格式进行处理,格式如下表所示。

六、对NES游戏文件格式的解析:在这方面主要由2种方式构成,一种是机顶盒支持文件系统,则对NES游戏文件的读取使用文件系统的方式读取,并按照相应NES格式解析;第二种是在不支持文件系统的机顶盒上,把NES文件模拟成一个数组数据,并按照相应的NES格式解析。NES文件为模拟用来储存NES卡带的映像。下面是一个。NES文件的结构。

  偏移  字节数  内容  0-3  4  字符串“NES^Z”用来识别。NES文件  4  1  16kB ROM的数目  5  1  8kB VROM的数目  6  1  D0:1=垂直镜像,0=水平镜像  D1:1=有电池记忆,SRAM地址$6000-$7FFF  D2:1=在$7000-$71FF有一个512字节的trainer  D3:1=4屏幕VRAM布局

  偏移  字节数  内容  D4-D7:ROM Mapper的低4位  7  1  D0-D3:保留,必须是0(准备作为副Mapper号^_^)

  D4-D7:ROM Mapper的高4位  8-F 8  保留,必须是0  16- 16KxM  ROM段升序排列,如果存在trainer,它的512字节摆在ROM  段之前  -EOF 8KxN  VROM段,升序排列

按照以上格式进行分析,就可以得出NES的数据。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号