一种gba游戏机模拟方法

文档序号:1588857阅读:530来源:国知局
专利名称:一种gba游戏机模拟方法
技术领域
本发明涉及一种模拟器,具体地讲是涉及一种GBA游戏机模拟方法。
背景技术
GBA(GameBoy Advance)是日本任天堂公司生产的一种很成功的掌上游戏机,它拥有丰富的高质量的游戏软件,其软件数量在一千部以上,这个游戏机在世界各地深受欢迎,销售量非常大。下面介绍一下GBA的结构。如图1、图2所示。
GBA CPU32位RISC类型CPU(ARM7TDMI)/16.78MHZ向下兼容GBC的能力为了兼容整合了一个8位的CISC类型CPU(不过,这个CPU不能和GBA的CPU同时工作)内存系统ROM 16K字节(包含2K字节的GBC系统ROM)工作RAM 32K字节+CPU外部256K字节(两个时钟周期)VRAM 96K字节OAM 64位*128调色板RAM16位*512(OBJ 256色,BG 256色)游戏卡ROM最大32MB掩膜ROM或者Flash ROM游戏卡RAM最大32MBSRAM或者Flash ROM显示240*160*RGB可同时显示32768色硬件支持特殊效果(旋转/缩放,α混合,淡入淡出,马赛克)4个图像模式操作操作键(A,B,L,R,START,SELECT和4个方向键)声音4个声道(相当于GBC的声道)+2个CPU直接控制声道(PCM格式)通讯串行通讯(8位/32位,UART,多人游戏,多用,游戏手柄总线)其他功能DMA支持4个通道的DMA(用于快速内存拷贝)定时器提供四个定时器,并且定时器可级联游戏卡和DMG、GBC一样,GBA装备了32针的游戏卡连接槽。当游戏卡插入的时候,GBA自动判断类型,并自动切换GBC和GBA模式。
可以在GBA系统上面使用的游戏卡1)DMG游戏卡,DMG/GBC双模式卡,GBC(GameBoy Color)专用卡;2)GBA专用卡。
表1 GBA的地址分配

ARM处理器是英国ARM公司设计的一种CPU。ARM处理器主要针对嵌入式系统和消费类电子产品,其特点是高性能、低功耗。现在的一些手机、MP3、PDA、照相机等都有应用。Intel公司的XScale处理器就具有ARM核,但在此之外也进行了扩展。ARM处理器有多个系列,如ARM7、ARM9等,GBA使用的是ARM7TDMI,支持ARM/THUMB两个指令集,但不带MMU(存储管理单元)。ARM处理器占据了嵌入式系统75%以上的市场份额。
为了能够在GBA以外的平台上也能玩GBA游戏,首先要把游戏软件从游戏卡中读出存为文件,好在网上已经有大量的游戏软件可供下载。GBA模拟器(重新编译后)可运行于多种硬件平台上,如PC、PSP(PSP是索尼公司的掌上游戏机)、手机等。其中最流行的是一种名为VisualBoyAdvance的模拟器(下面记作VBA),最初的版本可运行于windows或linux上,现在被移植到多个平台上,包括一些智能手机。需要说明的是,模拟器不能保证所有的GBA游戏都百分之百的兼容,VBA的兼容性在90%以上。
关于GBA游戏机的模拟方法是一种有关计算机程序的软件产品,因此在逻辑上通常称之为模拟器,即GBA模拟器。软件本质上是代码与数据的集合。代码是目标CPU的机器指令序列的集合,它总是针对某种特定类型CPU的。比如,GBA软件所包含的代码就是针对ARM7TDMI(或兼容)的CPU的。模拟器从大的结构上来说,要分为两个部分,一是对代码的执行部分,另一个是对输入输出设备的模拟。GBA模拟器就应该包括两个部分,一是对ARM CPU的模拟(包括存储器),另一部分是对输入输出的模拟,如显示、键盘输入、声音输出、游戏卡、串口(用于多机联网)等。
对CPU的模拟,对于VBA这种纯软件的模拟器来说,实际上是对代码的解释执行。过程是这样,定义一些变量代表CPU中的寄存器,分配一些内存表示CPU的存储器,然后读取一条指令,根据机器码解析一下,知道了该指令执行什么操作,比如是加法指令,就把两个操作数相加,操作数可以是寄存器,也可以是在存储器中,但对于模拟器来说都是在内存里的。然后再读下一条指令,再分析,执行,就这样一条条执行下去。在执行过程中会计算每条指令所需的时钟周期(在GBA上所需的时钟周期),目的是用于和输入输出部分进行同步。
对输入输出部分的模拟,目的是要从模拟器所运行的平台上获得用户的输入,并把GBA软件的输出又通过一定方式展现给用户。首先要知道GBA是如何进行输入输出的。在表1中给出的GBA地址分配中,0x04000000-0x040003FF这段地址是分配给I/O寄存器的,0x05000000-0x06FFFFFF是用于显示的,0x0D000000以上的内存是用于存储游戏进度的。模拟器需要对这些地址范围的数据进行一些特殊处理来实现I/O操作。现有技术方案的流程图如图3所示。模拟器首先分配和初始化内存,将GBA软件载入内存;初始化简单直接媒介层(SDL),创建窗口,初始化输入输出部分,如键盘输入、图像显示、声音输出等;判断周期数是否小于250000若是,则对指令进行解释执行,并计算周期数,然后重复上一步继续进行周期数判断;若否,则处理SDL事件,获得用户输入,刷新程序窗口,周期数清零;判断是否结束模拟若是,则关闭程序窗口,释放内存等;若否,则返回到周期数的数值大小判断步骤。
现有技术的缺点根据上面的分析可以看到,现有技术完全使用软件对GBA指令进行解释执行,可适用于不同的硬件平台,但带来的问题是效率极低。因为,解释执行一条指令大约需要花费30条指令,这是现有模拟器的性能瓶颈。以PC平台为例,至少需要500MHz的CPU才能使模拟器的性能接近于GBA。所以,目前的模拟器对处理器的性能要求太高。这还带来另外一个缺点,如果是在手机等使用电池的设备上运行模拟器,则运行时间会很短,一般不超过2小时。

发明内容
针对现有技术中存在的缺陷,本发明旨在提高GBA模拟器的性能,使之可用于手机、MP3、PDA等性能受限的产品上,使大量高质量的GBA游戏可流畅的运行于这些产品上,为这些产品增加一项新的业务功能。为实现上述目的,本发明采取以下设计方案一种GBA游戏机模拟方法,它包括如下步骤为GBA的I/O寄存器分配内存,并安装异常处理程序,监视GBA软件对该内存的访问;安装软件中断(SWI)异常处理程序,用来模拟GBA的BIOS功能;将GBA软件加载到内存中,使CPU执行载入内存的GBA软件;当模拟没有结束时处理异常事件,获得用户输入事件,将它转换为GBA软件的输入,模拟GBA的DMA功能,模拟GBA的中断功能,周期性的刷新画面;当模拟结束时释放内存。
上述的GBA游戏机模拟方法,其进一步的特征在于,所述的异常处理程序包括监视I/O寄存器所在的内存,当GBA程序写入产生异常时,就进行异常处理,即根据DMA寄存器的值来完成内存的拷贝;在软件中断异常处理程序中,通过程序代码,实现GBA BIOS提供的功能。
本发明是一种模拟方法,在逻辑上可以称之为模拟器。本发明所设计的模拟器最好运行在符合ARM体系结构V4或以上的处理器上,并兼容ARM/THUMB指令集。
正如现有技术所陈述的一样,既然解释执行是一种效率很低的方式,那么在符合ARM体系结构的处理器上完全可以直接执行GBA的代码,使效率提高几十倍。这也是本发明的一个关键点,有益效果之一。
本发明首先解决了对存储器的模拟。参见表1,除了BIOS以外的存储器都需要进行模拟,需要为这些地址段分配实际的物理地址,然后通过的一定的机制把GBA的地址映射到物理地址。如果CPU带有MMU,则可利用MMU实现,有些操作系统已经实现了该功能,也就是虚拟存储技术(virtual memory)。例如,在linux系统中,可使用系统提供的mmap来实现。或者也可以在CPU外挂接逻辑器件,该逻辑器件实现了内存管理以及地址映射功能,如图5所示。实现映射之后,模拟器就可以直接使用GBA所使用的地址了。例如,假设GBA软件在运行过程中需要访问一个变量在0x08000800处,那么在模拟器上它仍然可以使用该地址访问这个变量,这样就不需要对GBA软件进行任何修改。
GBA软件的加载假设GBA软件已经从游戏卡的ROM中读出并存为文件了,加载GBA软件就是把它从文件中读入到地址0x08000000处,然后从该地址开始执行。
过程如下1)加载GBA软件到内存中地址0x080000002)使程序计数器指向地址0x08000000在类似linux的操作系统上,需要专门创建一个线程或进程,GBA软件就在这个线程或进程中运行。
GBA的BIOS是固化在游戏机上的,不在游戏卡上。BIOS中的代码不易直接运行,因为BIOS代码是通过SWI指令进入的,而SWI指令往往也被操作系统用作系统调用的入口。SWI指令会产生一个异常叫做软件中断,此时CPU会查异常向量表,然后跳转到该向量指明的地址处执行,并且进入了supervisor模式。那么,通过修改异常向量表,使它执行本发明提供的异常处理程序。异常处理程序通过CPU的硬件断点寄存器来监视I/O寄存器所在的内存,当GBA程序写入时会产生data abort异常;在异常处理程序中,判断异常产生的原因是调试寄存器引起,且当前进程号为模拟器的进程号,就进入gba_drv的data abort处理程序,否则进入原有的异常处理流程;异常处理程序需实现DMA功能的模拟,即根据寄存器的值来完成内存拷贝的功能;异常处理程序还需实现GBA BIOS提供的功能,在该程序中,需判断该异常是否来自于正在运行的GBA代码,如果是,则执行GBA BIOS中提供的功能,否则执行原来的功能,本发明不需要使用GBA提供的BIOS代码,可通过分析GBA BIOS的代码,自行编写代码以实现相同的功能,但要保证接口一致。
有益效果针对现有技术中存在的缺陷,本发明的采用大大提高了GBA模拟器的性能,使之应用于手机、MP3、PDA等产品上畅通无阻。本发明创造性地将GBA软件直接运行在处理器上,通过外加硬件或利用处理器中的MMU,将GBA的地址空间映射到目标软硬件平台的地址空间,取得了显著性的技术效果。


图1是GBA游戏机CPU部分的原理图;图2是GBA游戏机整体结构图;
图3是现有技术方案的流程图;图4是本发明技术方案的总体流程图;图5是CPU与存储器的连接图;图6是本发明实施例的运行硬件环境图。
具体实施例方式
以下结合附图,对本发明的优选实施例详细介绍如下本发明涉及利用计算机程序来改善GBA游戏软件应用于其他产品性能不佳的一中模拟方法。本发明技术方案是一种模拟方法,在逻辑上可以称之为模拟器。
本发明实施例对中断的处理比较简单,GBA的中断向量在0x3007FFC处,可以把GBA的中断处理程序当作一个函数来调用。模拟器产生中断时,先设置中断请求标志寄存器(IF)中的相应位,然后再调中断处理函数。
202h-IF-Interrupt Request Flags/IRQ Acknowledge(R/W,see below)Bit Expl.
0 LCD V-Blank(1=Request Interrupt)1 LCD H-Blank(etc.)2 LCD V-Counter Match(etc.)3 Timer 0 Overflow (etc.)4 Timer 1 Overflow (etc.)5 Timer 2 Overflow (etc.)6 Timer 3 Overflow (etc.)7 Serial Communication (etc.)8 DMA 0 (etc.)9 DMA 1 (etc.)10DMA 2 (etc.)11DMA 3 (etc.)12Keypad (etc.)13Game Pak(external IRQ source) (etc.)14-15 Not used本发明实施例对输入输出的处理,表1中,0x04000000~0x040003FF用于I/O寄存器。GBA的I/O操作都是通过读写I/O寄存器来实现的。要想模拟GBA的I/O操作,关键的一点是要随时知道I/O寄存器的读写情况。要做到这一点,一种方法是借助于MMU,每当GBA代码访问0x04000000~0x040003FF这个地址段时,就产生一个异常,模拟器获得这个异常就可以随时知道I/O寄存器的读写情况。一般来说,MMU是由操作系统管理的。另一种方法是,有些CPU带有数据断点功能,这个功能一般是用作调试程序的,它也可在访问某个地址段时产生一个异常,只要对CPU中相关的寄存器进行配置就可以。第三种方法是,如图5所示,在使用的逻辑器件和CPU的接口上增加中断信号线,修改逻辑器件,使它可对某些地址进行监视,通过产生中断来通知CPU。
下面分别对各个I/O操作进行介绍显示0x04000000~0x0400005F这部分I/O寄存器是与显示相关的,其中关键的寄存器是LCD状态寄存器(DISPSTAT)和扫描线垂直计数器(VCOUNT),另外,0x05000000~0x070003FF这段内存也是GBA用于处理图像的,具体用途参考GBA手册。
DISPSTAT寄存器各个字段的含义Bit Expl.
0V-Blank flag(Read only)(1=VBlank)1H-Blank flag(Read only)(1=HBlank)2V-Counter flag (Read only)(1=Match)3V-Blank IRQ Enable (1=Enable)4H-Blank IRQ Enable (1=Enable)5V-Counter IRQ Enable (1=Enable)6-7 Not used8-15 V-Count Setting(0-227)bit3,4,5是三种中断请求使能位,当它们置1时,模拟器需要在符合中断条件时调GBA软件的中断处理程序。
VCOUNT-Vertical Counter(Read only)Bit Expl.0-7 Current scanline (0-227)8-15 Not UsedLCD扫描线的计数器,当它在160~227之间时,表示处于垂直空白期间,即VBLANK。显示一副游戏画面应该在VCOUNT>=160时,也就是在V-Blank期间。这里的关键是,当VCOUNT在0~159之间时,必须让GBA软件获得至少一次运行机会。GBA手册及及VBA的代码对于如何生成图像已有阐述。
定时器GBA提供4个定时器,定时器间还可级联,定时器到时可产生中断。每个厂家的CPU都会提供定时器,而每种CPU都会有自己的实现方式,不能一一列举。本发明的关键在于,定时器可以不实现,大多数GBA软件仍然可以运行。
DMA就是把一段数据从一个地址拷贝到另一个地址。GBA提供了四个DMA通道。0x040000B0-0x040000FF这部分寄存器是与DMA有关的。
0B0h,0B2h-DMA0SAD-DMA 0 Source Address0BCh,0BEh-DMA1SAD-DMA 1 Source Address0C8h,0CAh-DMA2SAD-DMA 2 Source Address0D4h,0D6h-DMA3SAD-DMA 3 Source Address0B4h,0B6h-DMA0DAD-DMA 0 Destination Address0C0h,0C2h-DMA1DAD-DMA 1 Destination Address0CCh,0CEh-DMA2DAD-DMA 2 Destination Address0D8h,0DAh-DMA3DAD-DMA 3 Destination Address0B8h-DMA0CNT_L-DMA 0 Word Count0C4h-DMA1CNT_L-DMA 1 Word Count
0D0h-DMA2CNT_L-DMA 2 Word Count0DCh-DMA3CNT_L-DMA 3 Word Count0BAh-DMA0CNT_H-DMA 0 Control(R/W)0C6h-DMA1CNT_H-DMA 1 Control(R/W)0D2h-DMA2CNT_H-DMA 2 Control(R/W)0DEh-DMA3CNT_H-DMA 3 Control(R/W)DMA控制寄存器

实现DMA的要点是当DMA控制寄存器的使能位置1时,不是立即执行一次数据拷贝的动作,而是要满足DAM启动条件时才拷贝,也就是需要看DMA控制寄存器中的bit12-13来决定;GBA的DMA可以支持重复拷贝,模拟器也必须实现该功能。例如,DMA使能,DMA repeat使能,(bit12-13)=1时,当VCOUNT=160时,就要执行一次DMA功能。
键盘输入就是要把模拟器所在平台的按键输入动作映射到GBA的按键动作,比如说,在手机上按下‘1’键,对应于GBA的‘up’等,按键之间的对应关系可以设定。实现时,首先获得设备的按键事件,然后根据对应关系,转换之后,在键盘状态寄存器(KEYINPUT)中置上相应的位,还需要根据键盘中断控制寄存器(KEYCNT)来决定是否产生中断。
130h-KEYINPUT(formerly P1)-Key Status(R)Bit Expl.
0Button A (0=Pressed,1=Released)1Button B (etc.)2Select (etc.)3Start (etc.)4Right (etc.)5Left (etc.)
6 Up (etc.)7 Down (etc.)8 Button R (etc.)9 Button L (etc.)10-15 Not used132h-KEYCNT(formerly P1CNT)-Key Interrupt Control(R/W)Bit Expl.
0 Button A(0=Ignore,1=Select)1 Button B(etc.)2 Select (etc.)3 Start (etc.)4 Right (etc.)5 Left(etc.)6 Up (etc.)7 Down(etc.)8 Button R(etc.)9 Button L(etc.)10-13 Not used14IRQ Enable Flag (0=Disable,1=Enable)15IRQ Condition (0=Logical OR,1=Logical AND)关于声音输出,串口通信的模拟实现与否,不影响GBA软件的其他功能的正常运行。
存储和读取游戏进度GBA本身提供了该功能,它是在游戏卡上有专用于存储游戏进度的区域,一般是flash、SRAM或EEPROM,在掉电后内容不会丢失。本模拟器不支持GBA方式的进度存储/读取。模拟器提供另一种方式,它可以实现实时的存储/读取进度。存储进度实际上是把当前状态存盘,包括CPU寄存器的内容,GBA存储器(表1)的内容,模拟器的状态。这里的关键是获得CPU寄存器的内容,如果平台本身带有操作系统,那么操作系统在进行进程切换时会保存CPU寄存器的内容,因此可借助于操作系统实现该功能。也可利用异常处理程序实现,当GBA代码执行SWI指令时产生一个异常,在该异常处理程序中可实现存储或读取进度的功能。在不带有操作系统的平台上,也能利用其他异常处理程序实现该功能。
实施例的应用环境硬件环境ARMV4以上的兼容CPU,支持ARM/THUMB指令集,主频200MHz,支持硬件断点功能,带有MMU,内存64M,带有分辨率至少240×160的显示器,至少9个键的键盘,能支持外置存储卡读写(SD/MMC等),如图6所示。
软件环境linux操作系统,支持虚拟存储技术(Virtual Memory),需支持毫秒级的进程调度,版本应在2.6以上;使用SDL函数库实现图形界面。
实施过程
本实施例的模拟器包括两个可执行文件,一个是Linux的驱动程序gba_drv,另一个是模拟器的主程序文件gba_emu。
Gba_drv在linux中安装一个假的设备,实际目的是设置异常向量处理程序。
1)创建一个字符设备,注册该设备的open,release,write操作,write是用来与gba_emu进行通信的;在gba_emu中要打开该设备,并通过write传递一些消息;2)gba_drv接收到来自gba_emu的消息后,对消息进行解释处理GBA_DRV_INST_HDL安装异常处理程序GBA_DRV_REM_HDL卸载异常处理程序3)异常处理程序通过CPU的硬件断点寄存器来监视I/O寄存器所在的内存,当GBA程序写入时会产生数据异常(data abort)。在异常处理程序中,判断异常产生的原因是调试寄存器引起,且当前进程号为模拟器的进程号,就进入gba_drv的数据异常处理程序,否则进入原有的异常处理程序。
4)异常处理程序需实现DMA功能的模拟,即根据寄存器的值来完成内存拷贝的功能;5)异常处理程序需实现GBABIOS提供的功能,可先分析GBABIOS的代码,然后再编写代码实现相同的功能,但要保证接口一致。
Gba_emu是该模拟器的主体,流程示意图如图4所示1)参考表1,为BIOS以外的存储器分配内存,并且在内存中的地址就等于表1中的地址,可使用mmap实现,初始化GBA的I/O寄存器,清空GBA的各个存储器;2)将GBA软件从文件读入到0x08000000处,初始化模拟器用到的各个参数、变量;3)初始化SDL,创建程序窗口,初始化键盘输入;4)创建一个进程proc_gba,该进程与gba_emu共享地址空间,记录proc_gba的进程号,proc_gba中将跳转到0x08000000处执行,但在跳转之前需等gba_emu发来可以运行的信号;5)打开gba_drv,发送GBA_DRV_INST_HDL消息,把proc_gba进程号传给gba_drv;6)提高本进程的优先级,要高于proc_gba,向proc_gba进程发出可以运行的信号;7)本进程进入睡眠状态,使得proc_gba获得运行机会,在proc_gba运行期间如果访问了I/O寄存器或执行了SWI指令,就会自动进入gba_drv安装的异常处理程序;
8)本进程睡眠结束,处理输入、输出动作,输入输出动作流程可以参见如下的“输入输出部分的伪代码”;9)当用户没有关闭本模拟器时,跳转步骤7;10)用户关闭本模拟器,终止进程proc_gba,向gba_drv发出消息GBA_DRV_REM_HDL,关闭Gba_drv,释放内存,关闭键盘、声音输出设备,关闭程序窗口。
输入输出部分的伪代码counter=228while counter>0if在垂直空白期间,即VBLANKVCOUNT++if使能了HBLANK中断IF|=2endifif使能了vcounter中断且vcounter=VCOUNTIF|=4endifif VCOUNT>=228使本进程进入睡眠状态,使proc_gba获得运行机会DISPSTAT&=0xFFFC;
VCOUNT=endifelseif在HBLANK期间,即水平空白期间if使能了HBLANK中断IF|=2endifVCOUNT++DISPSTAT&=0xFFFD;
if VCOUNT=160DISPSTAT|=1读取键盘输入,并转换为GBA的格式如果使能了键盘中断,设置IF|=0x1000;
检查是否需要执行一次DMA操作将游戏画面显示到程序窗口中endifelse产生游戏画面的一个扫描线DISPSTAT|=2;
endifendifif有中断请求要处理调GBA的中断处理程序if VCOUNT=159使本进程进入睡眠状态,使proc_gba获得运行机会
endifendifend of while虽然本发明已以较佳实施例公开如上,但它们并不是用来限定本发明,任何熟习此技艺者,在不脱离本发明之精神和范围内,自当可作各种变化或润饰,因此本发明的保护范围应当以本申请的权利要求保护范围所界定的为准。
权利要求
1.一种GBA游戏机模拟方法,其特征在于为GBA的I/O寄存器分配内存,并安装异常处理程序,监视GBA软件对该内存的访问;安装软件中断异常处理程序,用来模拟GBA的BIOS功能;将GBA软件加载到内存中,使CPU执行载入内存的GBA软件;当模拟没有结束时处理异常事件,获得用户输入事件,将它转换为GBA软件的输入,模拟GBA的DMA功能,模拟GBA的中断功能,周期性的刷新画面;当模拟结束时释放内存。
2.根据权利要求1所述的GBA游戏机模拟方法,其特征在于,所述的加载GBA软件过程如下加载GBA软件到内存中地址A处;使程序计数器指向地址A。
3.根据权利要求1所述的GBA游戏机模拟方法,其特征在于,所述的异常处理程序包括监视I/O寄存器所在的内存,当GBA程序写入产生异常时,就进行异常处理,即根据DMA寄存器的值来完成内存的拷贝;在软件中断异常处理程序中,通过程序代码,实现GBABIOS提供的功能。
全文摘要
本发明涉及一种GBA游戏机模拟方法,逻辑上称之为模拟器,流程为分配和初始化内存,将GBA软件载入内存地址A;初始化SDL,创建窗口,初始化输入输出部分;安装SWI及data abort异常处理程序;创建一进程proc gba,从地址A处开始新的进程;判断是否结束模拟若否,则模拟GBA的输入输出,使proc gba获得运行机会,处理SDL异常事件,获得用户输入,刷新程序窗口,然后重复判断是否结束模拟;若是,则关闭程序窗口,释放内存,卸载异常处理程序。本发明的运用大大提高了GBA模拟器的性能,使之应用于手机、MP3、PDA等产品上畅通无阻,技术效果极其显著。
文档编号A63F13/00GK1801113SQ200510094350
公开日2006年7月12日 申请日期2005年9月14日 优先权日2005年9月14日
发明者徐靖 申请人:徐靖
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1