分享
 
 
 

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

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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

作者:胡颖卓

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

起初,我为大家写一些新版本的FBA,但这样会和FBA小组的版本对应不上。更是近来,我需要将主要精力放在网络游戏上,所以也没有太多的时间为大家写这些驱动。在这里,我针对FinalBurn Alpha 2.93的CPS2游戏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函数。下面我们来看一下19XX的DrvInit函数,并为大家做详细的讲解:

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有