19

编辑,好消息!

10 年后,我决定我终于不得不坐下来让这件事发生。我编写了必要的 convert-8080-to-z80-or-x86 和 convert-z80-to-x86 工具,将 Sargon 代码转换为 x86 代码,增加了我在下面讨论的搜索深度,基本上实现了我的所有目标,请参阅项目网站

对于一个复古计算项目,我需要将 1970 年代 8080 汇编语言的主体翻译成 x86 形式。曾经有一段时间,用于实现这一目标的工具是英特尔推出 80x86 系列营销的关键部分。但是我的谷歌搜索技能似乎不适合找到那个原始工具或类似的东西。有谁知道这样的工具是否在任何地方都可用?

编辑

我决定添加一些背景信息,以更清楚地说明我想要做什么。这是出于普遍的兴趣,也可能是为了梳理出更多的反馈。

在之前的项目中,我查看了 1970 年代的国际象棋程序 Microchess,在作者 Peter Jennings 的祝福下,它在现代机器上运行。Peter 在他的网站上讲述了 Microchess 的故事,并提供了 6502 汇编语言源。我的贡献现已添加到故事中,可以在以下位置找到;

http://benlo.com/microchess/microchess9.html

我处理该项目的方法是手动最小化代码转换,使其匹配 C 语言语义,例如我转换了这个;

        LDY #$0F            ; CALCULATE
        LDA SQUARE          ; POINTS
ELOOP   CMP BK,Y            ; CAPTURED
        BEQ FOUN            ; BY THIS
        DEY                 ; MOVE
        BPL ELOOP
FOUN    LDA POINTS,Y        ;

对此;

        LDYi    (0x0F);     // CALCULATE
        LDA     (SQUARE);   // POINTS
ELOOP:  CMPx    (BK,Y);     // CAPTURED
        BEQ     (FOUN);     // BY THIS
        DEY;                // MOVE
        BPL     (ELOOP);
FOUN:   LDAf    (POINTS,Y);

我创建了与所需的所有 6502 指令匹配的 C 预处理器宏,例如 LDYi() 使用 (i)mmediate 值加载模拟寄存器 Y。

一段时间后,我发现一个德国人 Andre Adrian 拿走了我的代码并添加了一个接口,以使代码能够从现代国际象棋 GUI 中驱动。很酷,我希望我能想到这一点。这可以在他的网站上看到;

http://www.andreadrian.de/schach/index.html

在同一页面上(我使用谷歌翻译),他链接到 Sargon 的原始版本,另一个经典国际象棋程序,可能复古国际象棋经典,并表示希望有人能以与我相同的方式恢复此代码Microchess(我认为这就是谷歌翻译的意思)。好吧,好吧,我是来服务的!这次我也不会忽略添加GUI界面,或者我会与Andre合作。

Sargon 汇编语言就在这里;

http://web.archive.org/web/20040217034933/madscientistroom.org/chm/Sargon.html

Andre 删除了所有无关的内容,只留下了汇编语言代码;

http://www.andreadrian.de/schach/sargon.asm

现在,情节变厚了。安德烈试图让这些东西使用模拟器自己工作。(编辑 3jan2012 - Andre 已经将这一点向前推进了很多,您现在可以在现代 PC 上运行旧的 Sargon 代码 - 请参阅下面的答案和上面链接的他的网站)。但是有一个复杂的情况,我认为他不明白。Sargon 代码实际上是针对 Z80 的。但是汇编语言不是普通的 Z80 汇编,而是 8080 汇编,带有奇怪的 Intel 风格的 Z80 助记符,只有指令。一些背景;Zilog Z80 是英特尔 8080 的第三方后代。它使用 8080 指令集的二进制兼容超集。Zilog 决定为 Z80 提供一种更简洁、更正交但完全不同(在源代码级别)的汇编语言。第三方(第四方?)显然认为这是一个糟糕的决定,并采用了英特尔风格的 Z80 汇编器替代方案,Z80 扩展以英特尔风格的方式表达。或者他们只是使用现有 8080 汇编器的宏工具添加了 Z80 扩展。没关系; 复杂之处在于 Sargon 代码使用了这种相当奇怪的混合汇编程序。

有几个原因我想要一个 8080 到 x86 的转换器,而不是模拟 Z80 或重复我的 Microchess 项目中的 C 宏方法;

1)这次有更多的代码。如果可能的话,我想避免逐行编辑,即使它是一个最小的转换。

2) 这次我希望代码全速运行。在我看来,好像我可以增加搜索深度,这是我用 Microchess 做不到的。国际象棋代码会占用 CPU 周期,它需要尽可能多的时间,然后再想要更多。

3) 即使我有一个方便的仿真解决方案,我也需要组装这些东西,考虑到奇怪的汇编程序约定,这是一个问题。但是,如果我可以将所有 8080 助记符翻译成 x86,那么我可以在 x86 领域舒适地工作,只需将 <10% 左右的 Z80 扩展行手动翻译成等效的 x86 代码。

对不起这个漫无边际的帖子。希望至少有一个人会觉得它很有趣。另一项要求;我很想得到传奇的 Sargon 程序员 Dan 和 Kathe Spracklen 的祝福。但他们似乎根本没有网络存在。Dan Spracklen 在 LinkedIn 上,但它似乎是一个死的、反应迟钝的帐户。如果有人认识这些人或如何联系他们,请告诉我。

4

7 回答 7

4

Sargon 源代码现在在 CP/M 仿真器上运行。这是从 Wavemate Jupiter III 移植到 CP/M 的源代码

此处提供 CPM 模拟器

要组装源代码,您需要 TDL ZASM 和 TDL Linker。它们在这里可用。

在 MS-Windows 控制台窗口中创建 Sargon 的命令是:

cpm ZASM_TDL sargon

cpm tdl-link sargon

cpm sargon
于 2011-12-11T20:58:25.187 回答
4

http://www.arrakis.es/~ninsesabe/pasmo/ "从 0.5.0 版开始,还可以从 Z80 源代码生成 8086 代码,Ms-dos COM 文件的二进制格式或 CP/M 86 CMD 格式。 " Pasmo 0.6:“现在可以组装 8080 代码,或者与 Z80 混合。”

于 2010-12-11T17:15:22.283 回答
3

您必须实际翻译代码,还是模拟器就足够了?甚至还有一个用 Javascript 编写的!

于 2010-01-10T22:40:40.453 回答
3

您可能需要考虑一些替代方案。一种是将静态二进制转换为 C,如果将 8080 代码组装成二进制,这可能会更容易。看不到您的代码,您可能会遇到问题,因为这不是一对一的事情。8080 中的资源或运行它的主板与您计划在其下运行代码的 8086 不匹配。如果您翻译成 C 语言,那么您现在或现在都可以定位任何东西,而不仅限于模拟环境中的 x86 来解决先前的问题。这并不像看起来那么可怕或痛苦……实际上很有趣。

我一直在考虑做的事情不是翻译成 C 而是翻译成 llvm 的字节码。

编辑:

汇编器到汇编器的问题,除了有一天必须再做一次之外,不是指令的功能(寄存器 A = 寄存器 A + 1),而是标志和条件分支(寄存器 A = 寄存器 A + 1,如果A == 0 Z = 1 否则 Z = 0, ...)。根据您对 8080 与 Z80 的理解,您知道您将必须找到或创建一个可以解析该汇编程序的工具。我的理论是,您更有可能找到二进制汇编程序而不是转换工具。然后你可以从二进制模拟(远高于全速)或进行静态二进制翻译,最好是到 C。使用 C,你可以马虎,你可以让每条指令都有代码来更新标志,然后是 C 中的优化器编译器可以删除死代码。汇编程序不会做的事情,通过直接转到 x86,给您留下大量未使用的指令。我没有阅读手册或太多代码,因此可能很容易处理,但除了个别指令之外,还有堆栈和内存以及寄存器和用户界面的问题。如果这是使用图形/视频接口,您将不得不替换该代码批发,如果堆栈在 8080 和 x86 之间变化,那么您将不得不处理它,并且您可能是硬编码的内存地址将不得不处理。硬编码的很容易,计算的更难,跳转表等。堆栈用于参数传递和调用的方式可能因处理器而异,并且作者可能会以不将指令转换为指令的方式进行堆栈清理。这些都是我在进行汇编程序到汇编程序转换时遇到的所有事情,当然它不是从祖父母处理器到它的孙子处理器,例如 8080 到 x86。我一边踢一边尖叫,但最终看到,至少在我看来,C 语言的翻译涵盖了很多这样的问题。我愿意打赌,根据您所说的 z80 的 8080 变体,您可能无论如何都必须编写自己的程序集解析器。当您开始考虑有多少指令,有多少变化时,这里的任务似乎又是巨大的,无论是汇编程序还是静态翻译器。但是一旦你进入它,通过说明进行研磨并不是那么糟糕。至少在我看来,C 语言的翻译涵盖了很多这样的问题。我愿意打赌,根据您所说的 z80 的 8080 变体,您可能无论如何都必须编写自己的程序集解析器。当您开始考虑有多少指令,有多少变化时,这里的任务似乎又是巨大的,无论是汇编程序还是静态翻译器。但是一旦你进入它,通过说明进行研磨并不是那么糟糕。至少在我看来,C 语言的翻译涵盖了很多这样的问题。我愿意打赌,根据您所说的 z80 的 8080 变体,您可能无论如何都必须编写自己的程序集解析器。当您开始考虑有多少指令,有多少变化时,这里的任务似乎又是巨大的,无论是汇编程序还是静态翻译器。但是一旦你进入它,通过说明进行研磨并不是那么糟糕。

我知道我的回答与问题没有直接关系,问题是我在哪里可以找到这个工具。我的回答与:如果您找不到该工具,那么。如果您找到该工具,那么很好,完成。如果您找到一个可以让您接近的工具,那么您可以从那里手动或以编程方式进行调整。因为我之前做过几次,所以我知道完整的翻译可能是一个有趣的项目,特别是如果复古程序是您足够关心以迁移到现在的程序。

于 2010-01-11T01:38:52.943 回答
3

琐事:8086 指令集专门设计用于轻松从 8080 转换。例如,SAHF/LAHF 指令就是从这里产生的。

于 2010-09-07T03:25:05.007 回答
1

似乎有一个商业的 8080 到 8086 转换器可作为包的一部分在这里

于 2010-01-10T23:25:58.877 回答
1

您可以将 Z80 源代码组装成二进制文件吗?如果是这样,则在二进制文件上运行反汇编程序回到“正常”Z80 汇编程序。

于 2010-11-10T09:30:33.723 回答