65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (57投票s)

2015年9月1日

CPOL

19分钟阅读

viewsIcon

114993

downloadIcon

5357

CPS1 模拟器,ROM 破解

CPS1.NET 用户界面

引言

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 值。

拨码开关 (MAME)

拨码开关 (CPS1.NET)

偶尔会出现 GDI+ 错误,并显示一个红叉。您可以点击“文件-重置图片框”来处理该错误。

您可以参考 MAME 或其他模拟器的作弊文件来制作 CPS1.NET 作弊文件。对于某些模拟器(例如:Winkawaks),您应该对作弊地址进行 ^1 操作。

有两个文件用于记录输入。.sta 文件记录初始状态,.inp 文件记录输入键。您可以将多个 .inp 文件合并为一个 .inp 文件。例如,目录 "inp\punisher\" 中有 8 个记录输入(1.sta8.sta1.inp8.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 中转储 mainromgfxrammainram,则应在与 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

主窗体

M68000 调试器

恢复文件“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”。

将 Bred 改为 G. Oriber
2. 名将,上尉发射冰弹

首先,我将找出火精灵和冰精灵之间的关键区别。我使用作弊搜索功能先创建一个冰机器人(作弊文件“cht\cc robot.cht”)。然后我发现火或冰精灵的基本主内存地址是 0xB094。偏移量 0x23 字节(mainram[0xB0B7])决定了火或冰精灵(火为 0x06,冰为 0x07)。我记录“1”记录输入,并如下修改“ui\m68000Form.cs

修改源代码

重播“1”记录输入,并得到 TotalExecutedCycles 0x1011A877

主窗体

M68000 调试器

要“向后”调试,请回放“1”记录输入,逐步执行直到 TotalExecutedCycles 0x1011A777(回溯 0x100 个周期),然后逐步执行直到 TotalExecutedCycles 0x1011A877,并在 TotalExecutedCycles0x1011A7770x1011A877 之间时记录反汇编信息。

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)。

M68000 调试器

以类似的方式调试冰精灵(“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 支持

如何为盗版游戏添加新支持?

  1. 下载原始 ROM。
  2. 修改 MAME 代码并从运行中的 MAME 中转储 ROM。
  3. 为盗版游戏添加通用驱动程序并反汇编 M68000 代码。
  4. 更改 CPS 参数并添加自定义驱动程序,直到盗版游戏正常运行。

我已经添加了一些吞食天地 II 的常见系列和盗版系列

吞食天地 II (世界版 921002) [wof]

吞食天地 II (美国版 921031) [wofu]

三国志 II (亚洲版 921005) [wofa]

吞食天地 II - 赤壁之战 (日本版 921031) [wofj]

三国志 II:三剑圣 (中文盗版第一套,921005 亚洲版) [wof3js]

吞食天地 II - 赤壁之战 (日本版 921031) (中文翻译) [wofcn]

火凤凰 (三国志 II 的中文盗版) [wofhfh]

三国志 II:圣剑三国 (中文盗版) [wofsj]

三国志 II:三圣剑 (中文盗版) [wof3sj]

三国志 II:三剑圣 (中文盗版第二套,921005 亚洲版) [wof3jsa]

吞食天地 II ('sgyxz' 盗版) [sgyxz]
吞食天地 II:1对3 (中文盗版) [wof1v3]
吞食天地 II:大人 (中文盗版) [wofdr]
吞食天地 II:大人 2020 (中文盗版) [wofdr2020]
吞食天地 II:无双加强 (中文盗版) [wofdwp]
吞食天地 II:斗智 (中文盗版) [wofdz]
吞食天地 II:三妹 (中文盗版) [wofsm]
吞食天地 II:夏侯恩复仇 (中文盗版) [wofx]
吞食天地 II:战狼 (中文盗版) [wofzl]

我已从 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)

参考文献

  1. MAME-多街机模拟器 - https://github.com/mamedev
  2. MSDN - https://msdn.microsoft.com
  3. bizhawk M68000 和 Z80 代码 - https://github.com/TASVideos/BizHawk/tree/master/src/BizHawk.Emulation.Cores/CPUs
  4. Bryan McPhail 的 VCMAME 详情 - https://codeproject.org.cn/Articles/4923/VCMAME-Multiple-Arcade-Machine-Emulator-for-Visual
  5. MAME 和 MAMEUI Visual C 项目文件 - http://www.mikesarcade.com/arcade/vcmame.html
  6. M1.NET - https://codeproject.org.cn/Tips/646359/M-NET
© . All rights reserved.