代码之家  ›  专栏  ›  技术社区  ›  Bill Forster

在哪里可以找到8080到x86汇编程序转换工具?[闭门]

  •  15
  • Bill Forster  · 技术社区  · 16 年前

    编辑,好消息!

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

    对于复古计算项目,我需要将20世纪70年代的8080汇编语言翻译成x86形式。曾经有一段时间,一种用于实现这一点的工具是英特尔推出80x86系列的市场营销的关键部分。但我的谷歌搜索能力似乎无法胜任找到原始工具或类似工具的工作。有人知道这样的工具在哪里都有吗?

    编辑

    我决定添加一些背景信息,以便更清楚地了解我正在尝试做什么。这是为了大家的兴趣,也可能是为了梳理出更多的反馈。

    在之前的一个项目中,我研究了20世纪70年代的国际象棋程序Microches,在作者彼得·詹宁斯(Peter Jennings)的帮助下,它在当代机器上运行。彼得在他的网站上讲述了微型计算机的故事,并提供了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);
    

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

    一段时间后,我发现一个名叫安德烈·阿德里安的德国人拿走了我的代码,并添加了一个界面,使代码能够从现代象棋GUI中驱动。很酷,我希望我能想到这一点。这可以在他的网站上看到;

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

    在同一页上(我使用谷歌翻译),他链接到了Sargon的原始版本,这可能是另一个经典的国际象棋程序 这个 复古国际象棋经典,并表达了一个愿望,希望有人能把这段代码带回到生活中,就像我对Microches所做的那样(我想谷歌翻译就是这么说的)。好吧,我是来服务的!这次我不会忘记添加GUI界面,或者我会与Andre合作。

    萨尔贡汇编语言就在这里;

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

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

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

    现在,情节变得更加复杂。安德烈试图用模拟器让这些东西自己工作。(编辑2012年1月3日——安德烈已经将这一点向前推进了很多,现在你可以在现代PC上运行旧的萨尔贡代码——见下面他的答案和上面链接的他的网站)。但有一个复杂的问题,我认为他不明白。萨尔贡密码实际上是针对Z80的。但是汇编语言不是普通的Z80汇编语言,而是8080汇编语言,对于只支持Z80的指令,它有着奇怪的英特尔式助记符。一些背景;Zilog Z80是Intel 8080的第三方后裔。它使用8080指令集的二进制兼容超集。Zilog决定为Z80提供一种更干净、更正交但完全不同(在源代码级别)的汇编语言。第三个(第四个?)党显然认为这是一个错误的决定,并作出了另一种英特尔风格的Z80汇编程序,Z80扩展以英特尔式的方式表达。或者他们只是使用现有8080汇编程序的宏功能添加了Z80扩展。没关系;复杂的是,Sargon代码使用了这个相当奇怪的混合汇编程序。

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

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

    2) 我希望这次代码能全速运行。在我看来,我似乎可以增加搜索深度,这是我用微型计算机无法做到的。国际象棋代码会消耗CPU周期,需要尽可能多的CPU周期,然后需要更多的CPU周期。

    3) 即使我有一个方便的仿真解决方案,我也需要将这些东西组装起来,这是一个考虑到奇怪的组装程序惯例的问题。但如果我能将所有8080助记符翻译成x86,那么我就可以在x86环境下轻松工作,只需手动翻译<将大约10%的Z80扩展行转换为等效的x86代码。

    抱歉发了这篇漫无边际的帖子。希望至少有一个人会觉得有趣。另一项要求;我很想得到丹和凯西·斯普拉克伦的祝福,他们是传说中的萨尔贡程序员。但他们似乎根本没有网络存在。丹·斯普拉克伦(Dan Spracklen)在LinkedIn上,但它似乎是一个死气沉沉、毫无反应的账户。如果有人知道这些人或者如何联系他们,请告诉我。

    7 回复  |  直到 6 年前
        1
  •  4
  •   M.O.B. i L.    15 年前

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

        2
  •  4
  •   Nubok eQ19    11 年前

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

    A CPM emulator is available here

    要组装源代码,需要TDL ZASM和TDL链接器。 They are available here.

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

    cpm ZASM_TDL sargon
    
    cpm tdl-link sargon
    
    cpm sargon
    
        3
  •  3
  •   Greg Hewgill    16 年前

    你真的要翻译代码吗,还是 emulator 足够甚至还有一个是用Javascript编写的!

        4
  •  3
  •   old_timer    16 年前

    你可能想考虑一些替代方案。一种是将静态二进制翻译成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的翻译涵盖了这么多这样的问题。 我敢打赌,根据你所说的8080与z80的不同之处,你可能必须编写自己的汇编解析器。在这里,当你开始思考有多少指令,有多少变化时,汇编程序或静态翻译的任务似乎是不可能的巨大。但是,一旦你进入它的研磨通过说明不是那么糟糕。

    我知道我的答案与问题没有直接联系,问题是我在哪里可以找到这个工具。我的答案是:如果你找不到工具,那么。如果你找到了工具,那就好了。如果你找到了一个可以让你靠近的工具,你可以从那里手动或编程调整。因为我以前做过几次,我知道完整的翻译可以是一个有趣的项目,特别是如果复古项目是一个你足够关心的项目,可以迁移到现在。

        5
  •  3
  •   Yuhong Bao    16 年前

    琐事:8086指令集是专门为方便从8080翻译而设计的。例如,这就是SAHF/LAHF指令的起源。

        6
  •  1
  •   Chinmay Kanchi    16 年前

    似乎有一个商业8080至8086翻译作为一个包的一部分 here .

        7
  •  1
  •   Prof. Falken    15 年前

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

    推荐文章