【问题标题】:Where can I find a 8080 to x86 assembler conversion tool? [closed]我在哪里可以找到 8080 到 x86 汇编程序的转换工具? [关闭]
【发布时间】:2010-01-10 22:35:28
【问题描述】:

编辑,好消息!

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

对于一个复古计算项目,我需要将 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) 中间值加载模拟寄存器 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 周期,它需要尽可能多的 CPU 周期,然后需要更多。

3) 即使我有一个方便的仿真解决方案,我也需要组装这些东西,鉴于奇怪的汇编程序约定,这是一个问题。但是,如果我可以将所有 8080 助记符翻译成 x86,那么我可以在 x86 领域舒适地工作,只需将

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

【问题讨论】:

  • 您对将 Z80 转换为 x86 代码的信心如何?您可以使用 Z80 操作执行许多巧妙的技巧,甚至无法使用 8080,更不用说一些很少遇到的与条件位不兼容的问题。 Z80 在很多方面都是一个奇怪的 CPU。
  • 我非常有信心 :-) 我在 Z80 上咬牙切齿,多年来(从 1983 年到 1988 年左右)它是我的首选 CPU。我曾经喜欢 Z80 扩展,它们让 CPU 看起来很酷,而 8080 或 8085 则不然。查看 Sargon 代码,我认为我可以在几个小时的努力下手动翻译 Z80 特定的行。
  • 您是否看到过在“旧的 dos 档案”中漂浮的 asm 翻译器? nvm...看起来你已经找到了同一个。

标签: assembly x86 z80 retro-computing


【解决方案1】:

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

【讨论】:

  • +1 谢谢,这已经接近我需要的了。
【解决方案2】:

Sargon 源代码现在可以在 CP/M 模拟器上运行。 Here is the source ported from Wavemate Jupiter III to CP/M

A CPM emulator is available here

要组装源代码,您需要 TDL ZASM 和 TDL Linker。 They are available here.

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

cpm ZASM_TDL sargon

cpm tdl-link sargon

cpm sargon

【讨论】:

  • 您好 Andre,感谢您在您的网站上提供的所有复古国际象棋计算材料。我曾经非常热衷于推进这个项目,我购买了 Spracklen 书的二手副本,其中找到了原始代码清单,并按照这个问题中的说明做了一些准备工作。但后来我被所有其他项目淹没了,我无限期地把这个放在一边。我仍然希望回到它,因为正如你比任何人都清楚的那样,这样做的真正酷的事情是让 Sargon 作为 UCI 或 Winboard 引擎工作。
  • !link 现在我们有一个 Jupiter III 模拟器来运行 SARGON,它的图形与 1978 年相同。该程序在 link 上。源代码在link。这是我给自己和其他人的礼物。
  • 干得好!送给复古国际象棋计算爱好者的绝佳礼物。我将编辑我的问题,以表彰您推动这一进程。
  • cpmcons 的链接现已失效。 :-(
【解决方案3】:

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

【讨论】:

  • 我打算让 1978 年的老式 Sargon 国际象棋程序作为标准引擎运行,以与现代 GUI 一起使用。我之前用一些 6502 代码做过类似的事情,我用 C 预处理器制作了一种 6502 仿真器,请参阅benlo.com/microchess/microchess9.html 和 www.andreadrian.de/schach/index.html(德语)。但是 Sargon 代码应该更强大一些,我想获得接近原生性能,这样我就可以结束搜索深度并获得一种超级 Sargon。现在出去了,8小时左右没有cmet了。
  • 几年前,我对同一作者的苹果 (6502) 版本的黑白棋程序做了几乎完全相同的事情。即使在 1990 年左右,仿真的 6502(在 20 MHz x86 左右)也超过了实际 6502(1 MHz)的速度。今天,CPU 的速度将允许非常快速的仿真,而 8080 是一个非常简单的 CPU 架构。
  • 已经为 6502 做了一个模拟器和一个翻译器。如果你在别处找不到的话,我猜妈妈有一个 8080 模拟器。
  • @Greg,很酷,我用我的 Microchess 项目引导你。荣誉和+1。希望您发现我今天提供的其他背景很有趣。
【解决方案4】:

您可能需要考虑一些替代方案。一种是将静态二进制转换为 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 变体,您可能无论如何都必须编写自己的程序集解析器。当您开始考虑有多少指令,有多少变化时,这里的任务似乎又是巨大的,无论是汇编程序还是静态翻译器。但是一旦你进入它,通过说明进行打磨并没有那么糟糕。

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

【讨论】:

  • 感谢您的想法。我添加了一些你可能会感兴趣的背景。 +1
  • 感谢您刚刚注意到的编辑。我还没有 100% 致力于某种特定的方法。我以前也做过这样的事情,无论我采取什么方法,我都非常有信心可以让它发挥作用。一个关键因素是代码量是可控的,因此手动调整并不是世界末日。另外,通过快速调查,Spracklens 似乎绝对是出色的程序员,但他们并没有沉迷于太多的诡计,聪明之处在于算法。这使得翻译(通过任何方法)更容易。所有的图形,硬地址等。我会转储。妈的……
  • ... 这 600 个字符的限制!另一张海报谈到了 8080 标志与 Z80 标志的问题,但实际上不兼容的问题很小,并且仅限于很少使用的 O 和 P 标志。大多数汇编语言程序从不测试这些标志,我只会仔细检查,确保我理解我带来的算法,并仔细检查代码以进行验证,
  • 听起来是个有趣的项目,可惜我有一堆有趣的项目,有些类似于这个。祝你好运,听起来你可以很好地处理这个问题,以防你找不到现有的工具。
【解决方案5】:

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

【讨论】:

  • 对不起,当我看到你的评论时应该早点给你+1,为了一般利益。那天我为 8086 写了一个 8080 仿真器,没有使用 SAHF/LAHF。这是非常罕见的(独特的?),因为我见过的所有其他仿真器都需要 SAHF/LAHF,因为它们的内部代码解释器修改了标志。我的标志保持不变,因此 8086 标志可以本地模拟 8080 标志。巨大的性能胜利。这仍然是我最喜欢的 hack。万一有人偶然发现并对我是如何做到的感兴趣,请联系我(例如使用谷歌),我会分享。
  • 有关该历史的更多详细信息,以及更多链接,关于逆向计算。SE:The start of x86: Intel 8080 vs Intel 8086?
【解决方案6】:

似乎有一个商业 8080 到 8086 转换器可作为 here 软件包的一部分提供。

【讨论】:

  • 谢谢+1。如果我没有其他想法,我可能会考虑这个。
【解决方案7】:

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

【讨论】:

  • 感谢您在这个后期阶段的贡献。不,我没有使用英特尔风格助记符的奇怪 Z80 汇编程序。即使我这样做了,并且可以使用您描述的机制获得普通的 Z80 汇编程序,我也不会更好(实际上更糟)。原因是虽然 Intel 8080 -> Intel 8086 汇编转换器肯定存在,但 Z80-> 8086 等效工具更加模糊。仍然+1尝试!顺便说一句,我应该不好意思地补充一下,我还没有推进这个项目,它被其他更紧急的事情掩盖了。
  • @Bill Forster,这并不丢人。无论如何,很多快速 Z80 仿真器,甚至我认为是 JIT 仿真器。但是一旦你有了真正的 Z80 二进制代码,你就可以将它反向翻译成真正的 Z80,然后从那里生成 C 代码,然后编译成本地代码。
猜你喜欢
  • 2011-01-10
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
相关资源
最近更新 更多