FinalBurn Alpha 2.9x中CPS2游戏驱动程序的编写

原创 2003年02月05日 11:13:00

FinalBurn Alpha 2.9x
CPS2游戏驱动程序的编写

作者:胡颖卓


  FinalBurn Alpha是当今最好的CPS1/2模拟器之一,更可贵的是它是完全开放源码的。从FinalBurn Alpha 2.93开始,FinalBurn Alpha小组(以后简称FBA小组)便转向了多功能、多机种的支持,而不是像其它模拟器那样,出一个新游戏的破解就出一个新版,或是有一点儿改进就出一个新版。这样做利了开发者,而玩家却是觉得有些不便。

  起初,我为大家写一些新版本的FBA,但这样会和FBA小组的版本对应不上。更是近来,我需要将主要精力放在网络游戏上,所以也没有太多的时间为大家写这些驱动。在这里,我针对FinalBurn Alpha 2.93CPS2游戏19xx驱动为例,给大家做一下讲解,以便大家能自己写出新的驱动。

  首先,要包含驱动头文件cps.h,语句如下:

#include"cps.h"

  再者,是输入设备定义,也不用讲解,照例子抄就行了:

static struct BurnInputInfo DrvInputList[] =
{
 {"P1 Coin"  , 0, CpsInp020+4, "p1 coin"  },
 {"P1 Start" , 0, CpsInp020+0, "p1 start" },
 {"P1 Up"    , 0, CpsInp001+3, "p1 up"    },
 {"P1 Down"  , 0, CpsInp001+2, "p1 down"  },
 {"P1 Left"  , 0, CpsInp001+1, "p1 left"  },
 {"P1 Right" , 0, CpsInp001+0, "p1 right" },
 {"P1 Shot"  , 0, CpsInp001+4, "p1 fire 1"},
 {"P1 Bomb"  , 0, CpsInp001+5, "p1 fire 2"},

//19xx是两键游戏,如果是3键游戏,只需要按顺序加上就行了,例如
//{"P1 AutoFire", 0, CpsInp001+6, "p1 auto fire"},

 {"P2 Coin"  , 0, CpsInp020+5, "p2 coin"  },
 {"P2 Start" , 0, CpsInp020+1, "p2 start" },
 {"P2 Up"    , 0, CpsInp000+3, "p2 up"    },
 {"P2 Down"  , 0, CpsInp000+2, "p2 down"  },
 {"P2 Left"  , 0, CpsInp000+1, "p2 left"  },
 {"P2 Right" , 0, CpsInp000+0, "p2 right" },
 {"P2 Shot"  , 0, CpsInp000+4, "p2 fire 1"},
 {"P2 Bomb"  , 0, CpsInp000+5, "p2 fire 2"},

 {"Reset"      , 0, &CpsReset  , "reset"   },
 {"Diagnostic" , 0, CpsInp021+1, "diag"    },
 {"Service"    , 0, CpsInp021+2, "service" },
};

STDINPUTINFO(Drv);

  也有一种特殊情况,由于CPS2下格斗游戏非常多,而且使用的按键定义方法也一样,比如《少年街霸3》,我们就可以使用以下方法来定义:

STDINPUTINFOSPEC(Drv, CpsFsi);

  按照Razoola的定义,ROM的编号方式按照芯片的排列来进行编号:

  具体到文件名,扩展名编号方式如下:

01-02 QSound Z80数据
03-10 程序数据
11-12 QSound采样数据
13-20 图像数据

  ROM表的写法我们来看看19XX的写法:

static struct BurnRomInfo NinexxRomDesc[]=
{
//文件名     ,文件长度,CRC校验码 ,类型
 {"19xux.03" ,0x80000,0x239a08ae, 0x10},
//  0  XOR 表
 {"19xux.04" ,0x80000,0xc13a1072, 0x10}, //  1
 {"19xux.05" ,0x80000,0x8c066ec3, 0x10}, //  2
 {"19xux.06" ,0x80000,0x4b1caeb9, 0x10}, //  3

 {"19xu.03" ,0x80000,0x05955268, 0x10}, 
//  4  68000 代码 需要上面的进行解密
 {"19xu.04" ,0x80000,0x3111ab7f, 0x10},  //  5
 {"19xu.05" ,0x80000,0x38df4a63, 0x10},  //  6
 {"19xu.06" ,0x80000,0x5c7e60d3, 0x10},  //  7
 {"19x.07"  ,0x80000,0x61c0296c, 0x10},  //  8

 {"19x.13" ,0x080000,0x427aeb18, 1},    
//  9  图像数据,此处要按3,5,7,9,4,6,8,0此类顺序排列
 {"19x.15" ,0x080000,0x63bdbf54, 1},     //  10
 {"19x.17" ,0x080000,0x2dfe18b5, 1},     //  11
 {"19x.19" ,0x080000,0xcbef9579, 1},     //  12
 {"19x.14" ,0x200000,0xe916967c, 1},    
//  13
 {"19x.16" ,0x200000,0x6e75f3db, 1},    
//  14
 {"19x.18" ,0x200000,0x2213e798, 1},    
//  15
 {"19x.20" ,0x200000,0xab9d5b96, 1},    
//  16

 {"19x.01" ,0x020000,0xef55195e, 2},    
//  17 QSound数据 z80声音数据 

 {"19x.11" ,0x200000,0xd38beef3, 2},    
//  18 QSound声音采样
 {"19x.12" ,0x200000,0xd47c96e2, 2},    
//  19
};

STD_ROM_PICK(Ninexx) STD_ROM_FN(Ninexx)

  这里面Ninexx是我们自己可以定义的名称,改成_19xx也是可以的。

  之后是驱动信息结构,19XX的写法如下:



游戏ROM文件名称,为19xx的话,那对应19xx.zip
游戏名称
注释或其它信息
生产商
机型
出品年代
主ROM名称,例如19xx的西班牙版就需要在这里打上"19xx"
主板BIOS,不使用的话定义为NULL

运行标志,如果为纵版需要加上BDF_ROTATE_GRAPHICS_CCW
最大玩家数量
硬件类型
取zip名称特殊函数
Rom信息结构
Rom名称结构
输入配置信息表
DIP配置表

驱动初始化函数
驱动关闭函数
游戏帧处理函数
游戏刷新函数
游戏剪裁处理函数
游戏调色板空间
游戏画面宽度
游戏画面高度
游戏画面纵横比

struct BurnDriver BurnDrvCps19xx=
{
  {"19xx",
  "19XX: The War Against Destiny (US 951207)",
  "",
  "Capcom",
  "CPS2",
  "1995",
  NULL,
  NULL},

  BDF_GAME_WORKING | BDF_ROTATE_GRAPHICS_CCW,
  2,
  HARDWARE_CAPCOM_CPS2,
  NULL,
  NinexxRomInfo,
  NinexxRomName,
  DrvInputInfo,
  NULL,

  DrvInit,
  DrvExit,
  Cps2Frame,
  CpsRedraw,
  CpsAreaScan,
  &CpsRecalcPal,
  224,
  384,
  3,4
};

  DrvExit函数我们不用去管它,直接照抄一个就行了,关键在于DrvInit函数。下面我们来看一下19XXDrvInit函数,并为大家做详细的讲解:

static int DrvInit()
{
 int nRet=0;
 int i=0;
 unsigned char *pqs=NULL;

 Cps=2;                  
//CPS1型游戏为1,CPS2型游戏为2

 nCpsRomLen = 5*0x080000; //程序数据长度          对应文件3-10
 nCpsCodeLen= 4*0x080000;
//需要XOR表解密的长度   对应文件3-10
 nCpsGfxLen =  0x1000000;
//图象数据长度          对应文件13-20
 nCpsZRomLen= 1*0x020000;
//QSoundDataZ80数据长度 对应文件1-2
 nCpsQSamLen= 2*0x200000; //QSoundSample长度     对应文件11-12

 nRet=CpsInit();
 if(nRet!=0)return(1);

 // 装载程序ROM,这里5为程序ROM数量,4为XOR表ROM数量
 for(i=0;i<5;i++)
 {nRet=BurnLoadRom(CpsRom+0x080000*i,4+i,1); if (nRet!=0) return 1; }

 
// 解密程序ROM,这里4为XOR表ROM数量
 memcpy(CpsCode,CpsRom,nCpsCodeLen);
 for (i=0;i<4;i++)
 { nRet=BurnXorRom(CpsCode+0x080000*i,0+i,1); if (nRet!=0) return 1; }

 
// 装载图像ROM
 nRet=Cps2LoadTiles(CpsGfx          , 9);
//每次可以装载4个,后面的数字是ROM的起始编号
 nRet=Cps2LoadTiles(CpsGfx+0x0800000,13);
//0x0800000为前面4个ROM的总容量

 
// 装载Z80 ROM
 nRet=BurnLoadRom(CpsZRom,17,1);
//同上面的,17为起始编号,1为ROM数量,一次只能装载1个

 
// 装载QSound Samples ROM
 pqs=(unsigned char *)CpsQSam;
 nRet=BurnLoadRom(pqs         ,18,1);
//18为编号,ROM数量仅为1
 nRet=BurnLoadRom(pqs+0x200000,19,1);
//
 BurnByteswap(pqs,nCpsQSamLen);

 nRet=CpsRunInit(); if (nRet!=0) return 1;
 return 0;
}

  至此,以上的讲解已足够大家为新的游戏写出一个驱动了,希望下次Razoola放出新的CPS2游戏XOR表时,大家能够不至于等待谁写出新的驱动,而可以自己解决。


全文完

FinalBurn Alpha 2.9x中CPS2游戏驱动程序的编写

FinalBurn Alpha 2.9x中CPS2游戏驱动程序的编写作者:胡颖卓  FinalBurn Alpha是当今最好的CPS1/2模拟器之一,更可贵的是它是完全开放源码的。从FinalBurn...
  • hyzboy
  • hyzboy
  • 2004年10月03日 09:58
  • 1057

一个计算机爱好者的不完整回忆(五十六)CPS1基板上的那些经典游戏(1)

对我来说,印象最深的游戏大部分都出自于Capcom的CPS1基板上。
  • Arcan
  • Arcan
  • 2015年06月06日 21:36
  • 2701

FinalBurnAlpha中NEO-GEO游戏驱动程序的编写

FinalBurnAlpha中NEO-GEO游戏驱动程序的编写作者:胡颖卓  二年前我写了《FinalBurn Alpha中CPS-2游戏驱动程序的编写》一文,现由于模拟器界的三年原则惯例,所以很久都...
  • hyzboy
  • hyzboy
  • 2004年10月03日 09:59
  • 1025

USB驱动程序之USB设备驱动程序1简单编写

1、驱动编写分析 (1)usb总线驱动程序在我们接入USB设备的时候会帮我们构造一个新的usb_device.注册到总线里面来。左边这一块已经帮我们做好了,我们要做的是右边这一块。我们要构造一个us...
  • qingkongyeyue
  • qingkongyeyue
  • 2016年11月28日 22:28
  • 1554

写linux驱动程序的步骤

第一步:建立Linux驱动的骨架                 linux内核使用驱动时候,需要先初始化,包括建立设备文件,分配内存地址空间等,退出的时候要释放资源,删除设备文件,释放内存地址空间...
  • csdn_abcd
  • csdn_abcd
  • 2016年07月08日 14:31
  • 1123

驱动程序编写基本流程

驱动程序编写基本流程:   1.首先是一些版本信息,没什么用,但是不能少   #define __NO_VERSION__   #include   #include   char ke...
  • S510121202
  • S510121202
  • 2013年07月27日 17:36
  • 1393

FBA CPS2驱动编写模版

/* CPS2-FBA 《--游戏名称--》游戏驱动 */#include "cps.h"/*重要:ROM取值的大小按照同类型单个ROM最大值为基础 *//* 开始->定义控制器 *//*STDINP...
  • swotcoder
  • swotcoder
  • 2003年02月07日 12:53
  • 793

网卡驱动程序框架

我们这里说的是网卡驱动程序,不是网络驱动程序,网络有七层,我们写的只是最底层的东西,网络这么多层,但是最终你还是要操作硬件啊 所以上面肯定有个硬件相关层,我们要写的就是硬件相关的驱动程序这一小块。 网...
  • fight_onlyfor_you
  • fight_onlyfor_you
  • 2017年03月30日 23:31
  • 626

unity游戏优化之ETC压缩和 Alpha通道处理,让飞起来【NGUI篇】

本文转自:http://www.xiaobao1993.com/853.html 前言 在unity中。带有透明通道的图片压缩后。均会出现一定的质量的下降。并且带有透明通道的图片占用内存较...
  • hr8610
  • hr8610
  • 2016年03月10日 09:52
  • 923

一步步设计自己的驱动程序(转载)

实验目的:通过一个简单的设备驱动的实现过程。学会Linux中设备驱动程序的编写 实验内容:设计和实现一个虚拟命名管道(FIFO)的字符设备。写一个模块化的字符设备驱动程序 实验提示:一、设备的功能  ...
  • flyingdon
  • flyingdon
  • 2010年01月19日 14:55
  • 3492
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:FinalBurn Alpha 2.9x中CPS2游戏驱动程序的编写
举报原因:
原因补充:

(最多只允许输入30个字)