CPS1.NET:一个基于 C# 的 CPS1 (MAME) 模拟器





5.00/5 (57投票s)
CPS1 模拟器,ROM 破解
引言
CPS1 是 Capcom 开发的街机系统板,运行存储在可移动 ROM 卡带上的游戏软件。它上面发布了一些经典游戏,例如《快打旋风》、《名将》、《街头霸王 II': 冠军版》、《吞食天地 II》、《恐龙快打》、《惩罚者》。有一些模拟器可以模拟它:MAME、WinKawaks、Nebula、FBA...
MAME 是一个严格的非营利项目。它的主要目的是作为模拟街机机器内部工作原理的参考。您可以使用 MAME 源代码来做任何关于街机游戏的事情。CPS1.NET 是一个基于 C# 的 CPS1 模拟器,它保持了 MAME 的相同架构。通过使用 C# 和强大的集成开发环境——Microsoft Visual Studio,没有宏,您可以在任何地方调试 CPS1 游戏。原始屏幕尺寸是 384x224 像素。我将默认可见区域最大化到 512x512 像素,这样您可以看到更多细节(例如:悬挂的剑)。我将透明颜色设置为洋红色以显示更多背景细节。
CPS1.NET 按照以下步骤运行:加载 ROM、初始化机器、软重置机器,然后循环“cpuexec_timeslice
”操作。“cpuexec_timeslice
”操作意味着执行 M68000 CPU 一个时间片、执行 Z80 CPU 一个时间片,并执行定时器回调。定时器回调包括:视频更新、软重置、M68000 中断、Z80 中断、设置声音锁定值、声音更新、YM2151 中断。通过这些步骤,CPS1.NET 成功模拟了 CPS1 板。CPS1.NET 具有更多功能:保存和加载状态、录制和回放输入、作弊、作弊搜索、IPS(修补 M68000 ROM)、CPS1 调试器、M68000 调试器、Z80 调试器。
加载 ROM
CPS1 板中有两个 CPU 在工作:Motorola M68000 CPU 和 Zilog Z80 CPU。对于 CPS1 游戏,有两种不同的板。我将它们命名为 CPS-1 板和 CPS-1 (QSound) 板。
作为模拟器,CPS1.NET 首先加载 ROM。共有 6 种类型的 ROM:“maincpu.rom”、“gfx.rom”、“audiocpu.rom”、“audiocpop.rom”、“oki.rom”和“qsound.rom”。
对于 CPS-1 板,M68000 CPU 运行在 10MHz(某些游戏为 12MHz)。对于 CPS-1 (QSound) 板,M68000 CPU 运行在 12MHz。程序加载文件“maincpu.rom”作为 M68000 ROM。“maincpu.rom”的大小不应超过 0x400000 字节。
您可以从运行中的 MAME 中转储特定内存,并进行字节交换以生成“maincpu.rom”。文件“gfx.rom”包含要在屏幕上显示的图块数据。您可以直接从运行中的 MAME 中转储特定内存以生成“gfx.rom”。对于 CPS-1 板,Z80 CPU 运行在 3579545 Hz,并且有两个声卡芯片:Yamaha YM2151,Oki MSM6295。程序加载文件“audiocpu.rom”作为 Z80 ROM。
由于存在 CPS1 音频库切换,"audiocpu.rom" 的上限大小为 0x18000 字节。程序将 "oki.rom" 文件作为 Oki MSM6295 ROM 加载。对于 CPS-1(QSound) 板,Z80 CPU 运行在 8MHz,带有 Kabuki 加密代码,并带有一个 Q-Sound 芯片。程序将 "audiocpu.rom" 文件作为 Z80 ROM 仅用于 ReadMemory
,将 "audiocpuop.rom" 文件作为 Z80 ROM 仅用于 ReadOp。由于存在 Q-Sound 库切换,"audiocpu.rom" 的上限大小为 0x50000 字节。程序将 "qsound.rom" 文件作为 Q-Sound 芯片 ROM 加载。我的前一个项目 M1.NET 告诉您如何从正在运行的 MAME 中转储这些与声音相关的 ROM。
由于 M68000 是一个大端 CPU,CPS1.NET 也以大端字节顺序处理内存。CPS1.NET 的 ROM 格式最简单。您可以使用 IDA Pro 直接打开和反汇编“maincpu.rom”和“audiocpu.rom”(仅限 CPS-1 板)。没有多个 ROM 的组合,没有 CPS1 图形效果解码,没有 Kabuki 解码,也没有字节交换。因此,IPS 文件(.cht 扩展名,与作弊文件相同)易于理解。ROM 破解者可以专注于真实的地址-值对,而忽略 ROM 编码和解码。您还可以使用 CPS1.NET 中的 M68000 调试器和 Z80 调试器功能来反汇编 CPU ROM。
常见用法
构建环境:我仅在 Windows 7 Ultimate X64、Microsoft Visual Studio 2008 上测试。
运行环境:Microsoft .NET Framework 3.5 或更高版本。
热键:F3 -- 软重置,F7 -- 加载状态,Shift+F7 -- 保存状态,F8 -- 回放输入,Shift+F8 -- 录制输入(开始和停止),状态相关热键后的 0-9 和 A-Z -- 处理特定文件,F10 -- 切换全局节流,P -- 暂停和继续,Shift+P -- 跳过一帧。
控制键
- 1 -- P1 开始
- 2 -- P2 开始
- 5 -- P1 投币
- 6 -- P2 投币
- R -- 服务 1
- T -- 服务
- W -- P1 上
- S -- P1 下
- A -- P1 左
- D -- P1 右
- J -- P1 按钮 1
- K -- P1 按钮 2
- L -- P1 按钮 3
- U -- P1 按钮 4
- I -- P1 按钮 5
- O -- P1 按钮 6
- Up -- P2 上
- Down -- P2 下
- Left -- P2 左
- Right -- P2 右
- NumPad1 -- P2 按钮 1
- NumPad2 -- P2 按钮 2
- NumPad3 -- P2 按钮 3
- NumPad4 -- P2 按钮 4
- NumPad5 -- P2 按钮 5
- NumPad6 -- P2 按钮 6
当游戏 ROM 加载后,模拟器会自动暂停。您现在可以应用 IPS 和拨码开关,然后按 P 键继续。您可以从运行中的 MAME
获取正确的 dip-switch
值。
偶尔会出现 GDI+ 错误,并显示一个红叉。您可以点击“文件-重置图片框
”来处理该错误。
您可以参考 MAME 或其他模拟器的作弊文件来制作 CPS1.NET 作弊文件。对于某些模拟器(例如:Winkawaks),您应该对作弊地址进行 ^1 操作。
有两个文件用于记录输入。.sta 文件记录初始状态,.inp 文件记录输入键。您可以将多个 .inp 文件合并为一个 .inp 文件。例如,目录 "inp\punisher\" 中有 8 个记录输入(1.sta 到 8.sta,1.inp 到 8.inp)。请记住,在两个记录输入之间不要输入任何控制键。将文件 "1.sta" 复制到 "q.sta" 作为初始状态。依次将文件 "1.inp"、"2.inp"… "8.inp" 连接到文件 "q.inp"。因此,"q
" 记录输入是 "1
"、"2
"… "8
" 记录输入的组合。您可以通过组合多个片段轻松录制您最佳的输入。
支持的游戏
- 被遗忘的世界 (世界版,新) [forgottn]
- 被遗忘的世界 (世界版) [forgottna]
- 被遗忘的世界 (美国版,B-Board 88621B-2,修订版 C) [forgottnu]
- 被遗忘的世界 (美国版,B-Board 88618B-2,修订版 E) [forgottnue]
- 被遗忘的世界 (美国版,B-Board 88618B-2,修订版 C) [forgottnuc]
- 被遗忘的世界 (美国版,B-Board 88618B-2,修订版 A) [forgottnua]
- 被遗忘的世界 (美国版,B-Board 88618B-2,修订版 AA) [forgottnuaa]
- 失落的世界 (日本版) [lostwrld]
- 失落的世界 (日本旧版) [lostwrldo]
- 魔界村 (世界版) [ghouls]
- 魔界村 (美国版) [ghoulsu]
- 大魔界村 (日本版) [daimakai]
- 大魔界村 (日本再贩版) [daimakair]
- 出击飞龙 (美国版,B-Board 89624B-2) [strider]
- 出击飞龙 (美国版,B-Board 89624B-3) [striderua]
- 出击飞龙 (美国版,B-Board 90629B-3,有 bug 的街头霸王 II 转换版) [strideruc]
- 出击飞龙 (日本版) [striderj]
- 出击飞龙 (日本再贩版) [striderjr]
- 吞食天地 (美国版,B-Board 89624B-?) [dynwar]
- 吞食天地 (美国版,B-Board 88622B-3) [dynwara]
- 吞食天地 (日本版) [dynwarj]
- 吞食天地 (日本再贩版) [dynwarjr]
- 魔龙战记 (世界版) [willow]
- 魔龙战记 (美国版) [willowu]
- 魔龙战记 (美国旧版) [willowuo]
- 魔龙战记 (日本版) [willowj]
- 联合国大作战 (美国版) [unsquad]
- 战区 88 (日本版) [area88]
- 战区 88 (日本再贩版) [area88r]
- 快打旋风 (世界版,第一套) [ffight]
- 快打旋风 (世界版,第二套) [ffighta]
- 快打旋风 (美国版,第一套) [ffightu]
- 快打旋风 (美国版,第二套) [ffightu1]
- 快打旋风 (美国版 900112) [ffightua]
- 快打旋风 (美国版 900424) [ffightub]
- 快打旋风 (美国版 900613) [ffightuc]
- 快打旋风 (日本版) [ffightj]
- 快打旋风 (日本版 900112) [ffightj1]
- 快打旋风 (日本版 900305) [ffightj2]
- 快打旋风 (日本版 900613) [ffightj3]
- 街头霸王 / 快打旋风 (日本版,hack) [ffightjh]
- 1941:反击 (世界版 900227) [1941]
- 1941:反击 (世界版) [1941r1]
- 1941:反击 (美国版 900227) [1941u]
- 1941:反击 (日本版) [1941j]
- 战场之狼 II (世界版 900302) [mercs]
- 战场之狼 II (美国版 900608) [mercsu]
- 战场之狼 II (美国版 900302) [mercsur1]
- 战场之狼 II (日本版 900302) [mercsj]
- 龙王战士 (世界版 900619) [mtwins]
- 小魔女 (日本版 900619) [chikij]
- 魔法剑:英雄幻想 (世界版 900725) [msword]
- 魔法剑:英雄幻想 (世界版 900623) [mswordr1]
- 魔法剑:英雄幻想 (美国版 900725) [mswordu]
- 魔法剑:英雄幻想 (日本版 900623) [mswordj]
- 空战部队 (世界版 901012) [cawing]
- 空战部队 (世界版 901009) [cawingr1]
- 空战部队 (美国版 901012) [cawingu]
- 美国海军 (日本版 901012) [cawingj]
- 海底两万里 (世界版 901130) [nemo]
- 海底两万里 (世界版 901109) [nemor1]
- 海底两万里 (日本版 901120) [nemoj]
- 街头霸王 II:世界战士 (世界版 910522) [sf2]
- 街头霸王 II:世界战士 (世界版 910214) [sf2eb]
- 街头霸王 II:世界战士 (世界版 910318) [sf2ed]
- 街头霸王 II:世界战士 (世界版 910228) [sf2ee]
- 街头霸王 II:世界战士 (美国版 910206) [sf2ua]
- 街头霸王 II:世界战士 (美国版 910214) [sf2ub]
- 街头霸王 II:世界战士 (美国版 910306) [sf2uc]
- 街头霸王 II:世界战士 (美国版 910318) [sf2ud]
- 街头霸王 II:世界战士 (美国版 910228) [sf2ue]
- 街头霸王 II:世界战士 (美国版 910411) [sf2uf]
- 街头霸王 II:世界战士 (美国版 910522,修订版 G) [sf2ug]
- 街头霸王 II:世界战士 (美国版 910522,修订版 I) [sf2ui]
- 街头霸王 II:世界战士 (美国版 911101) [sf2uk]
- 街头霸王 II:世界战士 (日本版 911210) [sf2j]
- 街头霸王 II:世界战士 (日本版 910214) [sf2ja]
- 街头霸王 II:世界战士 (日本版 910306) [sf2jc]
- 街头霸王 II:世界战士 (日本版 910411) [sf2jf]
- 街头霸王 II:世界战士 (日本版 910522) [sf2jh]
- 街头霸王 II:世界战士 (日本版 920312) [sf2jl]
- 街头霸王 II:世界战士 (TAB Austria,盗版,第一套) [sf2ebbl]
- 街头霸王 II:世界战士 (TAB Austria,盗版,第三套) [sf2ebbl2]
- 街头霸王 II:世界战士 (TAB Austria,盗版,第四套) [sf2ebbl3]
- 街头霸王 II:世界战士 (Quicken Pt-I,盗版) [sf2qp1]
- 街头霸王 II:世界战士 (Thunder Edition,盗版) [sf2thndr]
- 三奇迹 (世界版 910520) [3wonders]
- 三奇迹 (世界版 910513) [3wondersr1]
- 三奇迹 (美国版 910520) [3wondersu]
- 奇迹 3 (日本版 910520) [wonder3]
- 三奇迹 (盗版) [3wondersb]
- 三奇迹 (hack) [3wondersh]
- 龙王战士 (世界版 910805) [kod]
- 龙王战士 (世界版 910711) [kodr1]
- 龙王战士 (美国版 910910) [kodu]
- 龙王战士 (日本版 910805,B-Board 90629B-3) [kodj]
- 龙王战士 (日本版 910805,B-Board 89625B-1) [kodja]
- 名将 (世界版 911202) [captcomm]
- 名将 (世界版 911014) [captcommr1]
- 名将 (美国版 910928) [captcommu]
- 名将 (日本版 911202) [captcommj]
- 名将 (日本版 910928) [captcommjr1]
- 名将 (盗版) [captcommb]
- 圆桌武士 (世界版 911127) [knights]
- 圆桌武士 (美国版 911127) [knightsu]
- 圆桌武士 (日本版 911127,B-Board 91634B-2) [knightsj]
- 圆桌武士 (日本版 911127,B-Board 89625B-1) [knightsja]
- 街头霸王 II':冠军版 (世界版 920513) [sf2ce]
- 街头霸王 II':冠军版 (世界版 920313) [sf2ceea]
- 街头霸王 II':冠军版 (美国版 920313) [sf2ceua]
- 街头霸王 II':冠军版 (美国版 920513) [sf2ceub]
- 街头霸王 II':冠军版 (美国版 920803) [sf2ceuc]
- 街头霸王 II':冠军版 (日本版 920322) [sf2ceja]
- 街头霸王 II':冠军版 (日本版 920513) [sf2cejb]
- 街头霸王 II':冠军版 (日本版 920803) [sf2cejc]
- 街头霸王 II':冠军版 (Hung Hsi,盗版) [sf2bhh]
- 街头霸王 II':冠军版 (Rainbow,盗版,第一套) [sf2rb]
- 街头霸王 II':冠军版 (Rainbow,盗版,第二套) [sf2rb2]
- 街头霸王 II':冠军版 (Rainbow,盗版,第三套) [sf2rb3]
- 街头霸王 II':冠军版 (Red Wave,盗版) [sf2red]
- 街头霸王 II':冠军版 (V004,盗版) [sf2v004]
- 街头霸王 II':冠军版 (Accelerator!,盗版,第一套) [sf2acc]
- 街头霸王 II':冠军版 (Accelerator!,盗版,第二套) [sf2acca]
- 街头霸王 II':冠军版 (Accelerator Pt.II,盗版) [sf2accp2]
- 街头霸王 II':冠军版 (L735 Test Rom,盗版) [sf2amf2]
- 街头霸王 II':冠军版 (Double K.O. Turbo II,盗版) [sf2dkot2]
- 街头霸王 II':冠军版 (在非 dash 板上的受保护盗版) [sf2ceblp]
- 街头霸王 II':冠军版 (带有 PAL 的“台湾”盗版) [sf2cebltw]
- 街头霸王 II':冠军版 (M2,盗版) [sf2m2]
- 街头霸王 II':冠军版 (M3,盗版) [sf2m3]
- 街头霸王 II':冠军版 (M4,盗版) [sf2m4]
- 街头霸王 II':冠军版 (M5,盗版) [sf2m5]
- 街头霸王 II':冠军版 (M6,盗版) [sf2m6]
- 街头霸王 II':冠军版 (M7,盗版) [sf2m7]
- 街头霸王 II':冠军版 (M8,盗版) [sf2m8]
- 街头霸王 II':冠军版 (M10,盗版) [sf2m10]
- 街头霸王 II':冠军版 (YYC,盗版) [sf2yyc]
- 街头霸王 II':冠军版 (Xiang Long,中文盗版) [sf2koryu]
- 街头霸王 II':冠军版 (东方不败保护,盗版) [sf2dongb]
- 冒险问答 Capcom World 2 (日本版 920611) [cworld2j]
- 冒险问答 Capcom World 2 (日本版 920611,B-Board 90629B-3,无电池) [cworld2ja]
- 冒险问答 Capcom World 2 (日本版 920611,B-Board 91634B-2) [cworld2jb]
- 空中特攻 (世界版 920714) [varth]
- 空中特攻 (世界版 920612) [varthr1]
- 空中特攻 (美国版 920612) [varthu]
- 空中特攻 (日本版 920714) [varthj]
- 空中特攻 (日本再贩版 920714) [varthjr]
- 问答与龙:Capcom 问答游戏 (美国版 920701) [qad]
- 问答与龙:Capcom 问答游戏 (日本再贩版 940921) [qadjr]
- 吞食天地 II (世界版 921031) [wof]
- 吞食天地 II (世界版 921002) [wofr1]
- 吞食天地 II (美国版 921031) [wofu]
- 三国志 II (亚洲版 921005) [wofa]
- 吞食天地 II:赤壁之战 (日本版 921031) [wofj]
- 火凤凰 (三国志 II 的中文盗版) [wofhfh]
- 街头霸王 II':疾风快打 (世界版 921209) [sf2hf]
- 街头霸王 II':疾风快打 (美国版 921209) [sf2hfu]
- 街头霸王 II Turbo:疾风快打 (日本版 921209) [sf2hfj]
- 恐龙快打 (世界版 930201) [dino]
- 恐龙快打 (美国版 930201) [dinou]
- 恐龙:新世纪 (日本版 930201) [dinoj]
- 恐龙猎人 (恐龙快打的中文盗版) [dinohunt]
- 惩罚者 (世界版 930422) [punisher]
- 惩罚者 (美国版 930422) [punisheru]
- 惩罚者 (西班牙语版 930422) [punisherh]
- 惩罚者 (日本版 930422) [punisherj]
- 飙风战警 (惩罚者的中文盗版) [punisherbz]
- 摔角霸王 (世界版 930713) [slammast]
- 摔角霸王 (美国版 930713) [slammastu]
- 筋肉人:身体爆炸 (日本版 930713) [mbomberj]
- 筋肉人双打:终极团队战 (世界版 931206) [mbombrd]
- 筋肉人双打:热血战士 (日本版 931206) [mbombrdj]
- 泡泡龙 (日本版 940608) [pnickj]
- 问答殿下之野望 2:全国版 (日本版 950123) [qtono2j]
- 洛克人:力量之战 (CPS1,美国版 951006) [megaman]
- 洛克人:力量之战 (CPS1,亚洲版 951006) [megamana]
- 洛克人:力量之战 (CPS1,日本版 950922) [rockmanj]
- 泡泡龙 (日本版 940322) [pokonyan]
- 魔法气泡 3 (欧洲版 950601) [pang3]
- 魔法气泡 3 (欧洲版 950511) [pang3r1]
- 魔法气泡 3:怪盗们的华丽午后 (日本版 950511) [pang3j]
- 魔法气泡 3 (盗版) [pang3b]
- 吞食天地 II:赤壁之战 (CPS Changer,日本版 921031) [wofch]
- 街头霸王 Zero (CPS Changer,日本版 951020) [sfzch]
- 街头霸王 Alpha:战士之梦 (CPS Changer,宣传版美国 950727) [sfach]
- 街头霸王 Zero (CPS Changer,巴西版 950727) [sfzbch]
- 三国志 II:三剑圣 (中文盗版第一套,921005 亚洲版) [wof3js]
- 吞食天地 II:1对3 (中文盗版) [wof1v3]
- 吞食天地 II - 赤壁之战 (日本版 921031) (中文翻译) [wofcn]
- 吞食天地 II:大人 (中文盗版) [wofdr]
- 吞食天地 II:大人 2020 (中文盗版) [wofdr2020]
- 吞食天地 II:无双加强 (中文盗版) [wofdwp]
- 吞食天地 II:斗智 (中文盗版) [wofdz]
- 吞食天地 II:三妹 (中文盗版) [wofsm]
- 吞食天地 II:夏侯恩复仇 (中文盗版) [wofx]
- 吞食天地 II:战狼 (中文盗版) [wofzl]
- 三国志 II:圣剑三国 (中文盗版) [wofsj]
- 三国志 II:三圣剑 (中文盗版) [wof3sj]
- 三国志 II:三剑圣 (中文盗版第二套,921005 亚洲版) [wof3jsa]
- 吞食天地 II ('sgyxz' 盗版) [sgyxz]
技术说明
CPS1.NET 中 CPS1 帧更新频率为 59.61 Hz。我只收集了 11 款经典 CPS1 游戏。如果您在“mame\cps\CPS.cs”和“ui\mame.xml”中添加一些代码,并制作相应的 ROM,则将支持任何其他 CPS1 游戏。如果您从运行中的 MAME
中转储 mainrom
、gfxram
或 mainram
,则应在与 CPS1.NET 值进行比较之前进行字节交换。您可以使用 CPS1 调试器功能轻松提取 CPS1 游戏的背景或精灵。
通过以下代码,您可以自动玩游戏并获得最佳分数(剩余 14 秒)。我已将其录制为“inp\wof\r.inp”。
由于 unsafe 代码很少,CPS1.NET 的效率低于其他模拟器。您应该使用性能相当高的硬件来运行 CPS1.NET,否则游戏会比正常情况运行得慢。
ROM 破解
您可以使用 CPS1.NET 的 M68000 调试器和 Z80 调试器功能有效地破解 ROM。对于初学者来说,M68000 ROM 破解包含以下步骤:确定关键的 mainram 地址和值,对 M68000 CPU 进行“向后”调试,直到获得特定的 mainrom 地址和值,修补目标 mainrom。现在我展示三个示例
1. 快打旋风,改变第一个敌人
使用作弊搜索功能,我发现第一个敌人的基本主内存地址是 0x8FE8
。偏移量 0x13 和 0x14 字节(mainram[0x8FFB]
和 mainram[0x8FFC]
)决定了第一个敌人的类型。我录制了“1
”记录输入,并如下修改“mame\cps\Memory.cs”和“ui\m68000Form.cs”
回放“1
”记录输入。目标 PPC 是 0x006210
。
恢复文件“mame\cps\Memory.cs”和“ui\m68000Form.cs”。获取以下反汇编信息
A[3]=0x0006D02C A[4]=0xFFFF8FE8
006210: 196B 0007 0013 move.b ($7,A3), ($13,A4)
006216: 396B 0008 0014 move.w ($8,A3), ($14,A4)
如果您更改字节 mainrom[0x06D02C+0x07]
和 mainrom[0x06D02C+0x08]
,您将更改第一个敌人的类型。因此我制作了 IPS 文件“ips\ffight.cht”。
2. 名将,上尉发射冰弹
首先,我将找出火精灵和冰精灵之间的关键区别。我使用作弊搜索功能先创建一个冰机器人(作弊文件“cht\cc robot.cht”)。然后我发现火或冰精灵的基本主内存地址是 0xB094
。偏移量 0x23 字节(mainram[0xB0B7]
)决定了火或冰精灵(火为 0x06,冰为 0x07)。我记录“1
”记录输入,并如下修改“ui\m68000Form.cs”
重播“1
”记录输入,并得到 TotalExecutedCycles 0x1011A877
。
要“向后”调试,请回放“1
”记录输入,逐步执行直到 TotalExecutedCycles 0x1011A777
(回溯 0x100 个周期),然后逐步执行直到 TotalExecutedCycles 0x1011A877
,并在 TotalExecutedCycles
在 0x1011A777
和 0x1011A877
之间时记录反汇编信息。
001D80: 3B41 2816 move.w D1, ($2816,A5)
001D84: 4E75 rts
01F39C: 49FA 00CC lea ($CC,PC), A4
01F3A0: 4EB8 2FEC jsr $2FEC.w
002FEC: 214C 001C move.l A4, ($1C,A0)
002FF0: 6000 0022 bra $3014
003014: 2868 001C movea.l ($1C,A0), A4
003018: 315C 0020 move.w (A4)+, ($20,A0)
00301C: 315C 0058 move.w (A4)+, ($58,A0)
003020: 315C 0022 move.w (A4)+, ($22,A0)
003024: 215C 0024 move.l (A4)+, ($24,A0)
注意 lea 操作将 A4 值更改为 0x0001F46A
并转到火焰子函数(PPC=0x01F39C, PC=PPC+2=0x01F39E, A4=0x01F39E+0x00CC=0x0001F46A
)。
以类似的方式调试冰精灵(“2
”记录输入),并获得以下反汇编信息
001D80: 3B41 2816 move.w D1, ($2816,A5)
001D84: 4E75 rts
01F3DC: 49FA 04C0 lea ($4C0,PC), A4
01F3E0: 4EB8 2FEC jsr $2FEC.w
002FEC: 214C 001C move.l A4, ($1C,A0)
002FF0: 6000 0022 bra $3014
003014: 2868 001C movea.l ($1C,A0), A4
003018: 315C 0020 move.w (A4)+, ($20,A0)
00301C: 315C 0058 move.w (A4)+, ($58,A0)
003020: 315C 0022 move.w (A4)+, ($22,A0)
003024: 215C 0024 move.l (A4)+, ($24,A0)
注意 lea 操作将 A4 值更改为 0x0001F89E
并转到冰子函数(PPC=0x01F3DC, PC=PPC+2=0x01F3DE, A4=0x01F3DE+0x04C0=0x0001F89E
)。
如果我将 PPC=0x01F39C
操作 "lea ($CC,PC), A4
" 更改为 "lea ($0500,PC), A4
" (0x01F39E+0x0500=0x01F3DE+0x04C0=0x01F89E
),则船长将发射冰弹。因此 IPS 命令是(参见 "ips\captcomm.cht")
[captain discharge]
fire=01F39E,00;01F39F,CC
ice=01F39E,05;01F39F,00
3. 惩罚者,始终持枪
MAME 作弊文件“punisher.xml”中有以下代码
<cheat desc="Always have Gun drawn">
<script state="run">
<action>main.pb@FF5D96=01</action>
</script>
</cheat>
因此我修改了“mame\cps\Memory.cs”并插入断点,然后玩游戏,如下所示
我发现以下 PPC 代码经常将 mainram[0x5D96]
写入零(A5=0xFFFF8000
)
0268E6: 422D DD96 clr.b ($DD96,A5)
我阅读了 M68000
操作码,发现 BSETr
操作类似于 CLR 操作。BSETr
写入非零,而 CLR 写入零。如果我将 M68000 ROM 打补丁为
0268E6: 01ED DD96 bset D0, ($DD96,A5)
玩家将始终持枪。
在枪战场景中,以下 PPC 代码经常将 mainram[0x5D96]
写入非零(A5=0xFFFF8000
)
05E93E: 522D DD96 addq.b 1, ($DD96,A5)
如果我将 M68000 ROM 打补丁为
0268E6: 522D DD96 addq.b 1, ($DD96,A5)
玩家也将始终持枪。
如果我将 M68000 ROM 打补丁为
0268E6: 4E71 nop
0268E8: 4E71 nop
或
0268E6: 422D 8000 clr.b ($8000,A5)
我禁用了频繁的“将 mainram[0x5D96] 写入零
”操作。一旦玩家拔出枪,他就永远不会收回枪。所以我制作了 IPS 文件“ips\punisher.cht”。
吞食天地 II 支持
如何为盗版游戏添加新支持?
- 下载原始 ROM。
- 修改 MAME 代码并从运行中的 MAME 中转储 ROM。
- 为盗版游戏添加通用驱动程序并反汇编 M68000 代码。
- 更改 CPS 参数并添加自定义驱动程序,直到盗版游戏正常运行。
我已经添加了一些吞食天地 II 的常见系列和盗版系列








我已从 ROM 的“maincpu.rom”和“gfx.rom”中提取了以下信息。
English | 日语 | 简体中文 |
香罗:一个在黑暗领主阿基拉-奥尔汗的铁腕统治下,充满谋杀和暴力的国家。阿基拉-奥尔汗将自己的国家推向毁灭和绝望,现在又将贪婪的目光投向邻国。随着他的征服阴影蔓延,一个人挺身而出对抗这股黑色洪流。他名叫关帝,在他的王国中,在五位最伟大的战士和一位最聪明的人的帮助下,关帝将为保卫他的人民和土地而战。战斗开始了…… | 2200 年前,中国大陆有一个被称为汉的帝国。刘邦建立的汉帝国已历时 400 余年,终于迎来了动乱时期。趁着混乱夺取政权的董卓,滥施暴政,使百姓苦不堪言。拥有汉王朝血脉的刘备,与关羽、张飞、赵云一起加入了联军,粉碎了董卓的野心。此后 7 年,曹操占据了汉朝 1/3 的领土,自称为魏王,并进攻刘备驻守的荆州。 | 距今2200年前,刘邦建立汉朝。400年后,汉朝分裂,天下大乱。混乱之中,政权落入了董卓之手。残暴的统治,令百姓民不聊生,哀嚎遍野。拥有汉室血统的刘备,联同关羽、张飞、赵云一起加入了联合军,粉碎了董卓的野心。七年后,汉朝1/3的领土落入了曹操手中。他自立为魏王,起兵攻打驻荆州的刘备。 |
随着阿基拉-奥尔汗的失败,关帝很快重建了他的王国。和平与繁荣重回大地,他开启了一段漫长而辉煌的统治,这段统治被后世铭记和赞颂。 | 刘备复兴了汉王朝。人们恢复了和平的生活。 | 刘备复兴了汉王朝。人们又重新过上了和平的生活。 |
阿基拉-奥尔汗很快卷土重来,在他的爪牙的帮助下,他迅速征服了国家。用他的铁腕粉碎了一切异议。 | 回到本国的曹操全力以赴打败刘备,恢复国力后攻占了荆州。 | 回国后的曹操为打败刘备全力备战。国力恢复后就立刻向荆州进攻,占领了荆州。 |
回到本国的曹操未能战胜刘备,魏、吴、蜀三国鼎立的局面逐渐形成…… | 回国后的曹操没能战胜刘备。魏、吴、蜀三国鼎立的局面逐渐形成… |
结论
我已经完成了 CPS1.NET。它揭示了 CPS1 游戏的工作原理。您可以参考 MAME 源代码,使其支持任何其他 CPS1 游戏。通过从 C 到 C# 的翻译,几乎没有不安全的代码,代码更具可读性。我保留了 MAME 的主要架构。程序员可以参考 CPS1.NET 源代码,用 C# 模拟更多基于 M68000 和 Z80 的游戏系统。
历史
- 2015-09-01:完成 CPS1.NET (build 20150901)
- 2016-01-25:改进代码和架构 (build 20160125)
- 2016-04-29:添加对吞食天地 II 系列的支持 (build 20160429)
- 2016-08-01:支持 191 款游戏 (build 20160801)
- 2018-01-09:改进代码和架构,支持 192 款游戏 (build 20180109)
- 2018-12-27:修复 mercs 错误 (build 20181227)
- 2021-04-04:添加 8 款盗版游戏,支持 200 款游戏 (build 20210404)
参考文献
- MAME-多街机模拟器 - https://github.com/mamedev
- MSDN - https://msdn.microsoft.com
- bizhawk M68000 和 Z80 代码 - https://github.com/TASVideos/BizHawk/tree/master/src/BizHawk.Emulation.Cores/CPUs
- Bryan McPhail 的 VCMAME 详情 - https://codeproject.org.cn/Articles/4923/VCMAME-Multiple-Arcade-Machine-Emulator-for-Visual
- MAME 和 MAMEUI Visual C 项目文件 - http://www.mikesarcade.com/arcade/vcmame.html
- M1.NET - https://codeproject.org.cn/Tips/646359/M-NET