14

我以前的一个相关问题是在这里逆向工程旧油漆程序

我在这里建立了我的运营基地:http: //animatorpro.org wiki 即将推出。

好的,现在我有一个 300,000 行的遗留 MSDOS 代码库。这是一种“小心你想要的”的情况。我不是一个经验丰富的 C 程序员。我也不是完全没有经验,但出于所有意图和目的,我对这门语言,尤其是它的库的复杂性是个菜鸟。我特别不知道专门为 MSDOS 编写的 C 程序和跨平台程序之间的差异的变幻莫测。然而,我已经研究这个代码库一年多了,这就是我对 Animator Pro 的了解:

使用的编译器和工具:

  • Watcom C 编译器
  • tcmake(从 Turbo C 制作程序)
  • 386asm,Phar Lap dos 扩展器的专用汇编器
  • 当然,还有 Phar Lap dos 扩展器本身。
  • 一些不起眼的 dos 实用程序

大部分编译似乎是由批处理文件驱动的。虽然我已经获得了所有这些工具的副本,但我还没有成功编译它。(虽然我已经编译了它的哥哥,autodesk animator original。

它有一个基于 REX 的插件系统,可以在 DLL 可用之前复制 DLL。插件系统处理:

  • 视频驱动程序(包含大量 VESA 驱动程序)
  • 输入驱动程序(包括 wacom 数位板和键盘)
  • 绘图工具
  • 墨水(如 Photoshop 的滤镜或混合模式)
  • 脚本插件(基本上是编译脚本)
  • 文件格式

它有自己的脚本解释器,名为 POCO,基于 C 语言——脚本语言有足够的能力完成插件系统几乎可以做的所有事情——只是速度较慢。

鉴于这些信息,这是我的发展计划。请批评这一点。上面的链接中提供了源代码,因此如果您愿意,您可以轻松地自行评估情况。

  1. 使用其原始工具进行编译。
  2. 切换到使用 DJGPP,并进行必要的更改以使其与原始汇编器一起编译。
  3. 包括 Allegro.cc“游戏”库,并尽可能多地将功能切换到该库 - 也许只需编写使用 Allegro API 的新视频和输入驱动程序。我正在考虑 allegro 而不是 SDL,因为:有一个 DOS 版本的 Allegro,令人着迷的是,它的核心功能之一是能够播放 Animator Pro 的原生格式 FLIC。
  4. 希望在 3 之后,我将消除项目中的大部分或全部汇编程序。我满怀希望地说,因为它是一种晦涩难懂的方言,在没有重大修改的情况下无法在任何现代自由汇编器中组装。我都试过了。如果我可以定义汇编程序的实际功能,则剩下的任何内容都将转换为在 NASM 中进行汇编,或者转换为 C 代码。
  5. 将 dos 扩展器从 Phar Lap 切换到 HX Dos http://www.japheth.de/HX.html,它承诺尽可能多地复制 WIN32 api。然后进行所有必要的代码更改以使其正常工作。
  6. 切换到 Allegro.cc 的 win32 版本,假设 win32 版本可以在 HXDos 之上运行。进行任何进一步的必要更改
  7. 修改插件系统以使用某种标准的跨平台插件库。这会是什么,我不知道。也许你可以提供一些建议?我与最初编写插件系统的开发人员进行了交谈,他说由于分段限制,它所做的一些事情在现代操作系统上是不可能的。我不确定这意味着什么,但我猜这意味着所有插件几乎都需要从头开始重写。
  8. 神奇的是,我完成了以上所有工作,我们可以尝试让它在 windows、osx 和 linux 中运行,同时处理其他跨平台的小问题,比如长文件名,以及我没有想到的东西。

有人对此有任何疑问吗?快板是一个不错的选择吗?如果不是,为什么?你会怎么处理这个插件系统?你会做什么不同的事情?这整件事是不是很愚蠢,我应该从头开始重写它,以原作为灵感吗?(显然需要原始开发人员“大约一个月”才能做到这一点)

我上面没有提到的一件事是文本/字体系统。不知道该怎么做,但 Animator Pro 有自己的自定义字体格式,而且还能够使用 Postscript Type 1 字体和其他一些格式。

4

3 回答 3

7

简而言之,我对你的计划最大的担忧是:你的方法似乎是试图让整个巨大的东西一直工作,调整环境,使其远离 DOS。在对环境的每次调整期间,这意味着您将有大约十亿个微妙的假设可能会立即被打破,而您还不一定了解这些假设。一次将它们全部解开将是非常痛苦的。

如果我在做移植,我的方法是尽可能多地禁用代码,以使某些东西在现代环境中运行,然后一次一件地使部件重新联机。编写一个简单的测试工具程序,加载一个显示驱动程序并绘制一些东西,然后为 DOS 编译它以确保您理解界面。然后编写一些实现相同接口但使用 Allegro(或 SDL 或 SFML)的 C 代码,并使该程序在 Windows 或 Linux 下工作。当输出不同时,您可以使用一个简单的测试用例。

你在这个端口上的全部工作就是用全新的接口和功能替换各种接口和功能的实现。 这是单元测试擅长的工作。 如果没有在 DOS 下运行在旧代码上的某种测试,请不要编写任何新代码!尽可能使您的潜在问题变得小而简单。移植汇编代码而不是仅在您有理由相信它实际上会使您的工作更轻松时才重写它(即,在 NASM 下只需少量调整即可编译的算法内容)。不要咬下一块比你一次能舒服地塞进大脑的大块。

我,一方面,期待看到你的进步!我认为您正在尝试做的事情很棒。谢谢你这样做。

于 2011-02-07T20:39:55.007 回答
6

嗯 - 我可能会通过为它编写一个 OpenGL 视频“驱动程序”来接近它。今天的机器速度足够快,拥有大量内存,您可以将主 CPU 上的所有像素特定算法放入后台缓冲区,它会起作用。由于“通用”VGA 驱动程序只是将视频缓冲区映射到一个指针,这将是一个开始的地方。UI 中有一个缩放模式,因此您可以在高分辨率显示器上查看像素。

于 2011-06-06T19:28:56.957 回答
0

通常很难采用在编写时没有考虑到可移植性的现有非平凡代码库(您提到了一些),然后尝试使其可移植。路上会遇到很多问题。从头开始并仅使用现有代码作为参考重写代码可能是一个更好的主意。如果您从头开始,您可以在 Qt 等新项目中利用现有的可移植 UI 解决方案。

于 2011-02-06T03:02:12.460 回答