Где можно найти инструмент преобразования ассемблера с 8080 по x86?

Для проекта ретро-вычислений мне нужно перевести тело ассемблера 8080-х годов 80-х годов в форму x86. Было время, когда инструмент для этого был ключевой частью маркетинга Intel для внедрения семейства 80x86. Но мои навыки работы с поисковыми системами, похоже, не позволяют найти этот оригинальный инструмент или что-то подобное. Кто-нибудь знает, доступен ли такой инструмент где угодно?

ИЗМЕНИТЬ

Я решил добавить некоторую справочную информацию, чтобы сделать ее более ясной, что я пытаюсь сделать. Это для общего интереса, а также, возможно, для того, чтобы высмеять еще несколько отзывов.

В предыдущем проекте я взглянул на шахматную программу Microchess эпохи 1970-х годов, и по благословению автора Питер Дженнингс начал работать на современных машинах. Питер рассказал историю 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);

Я создал макросы препроцессора C, соответствующие всем требуемым инструкциям 6502, например LDYi() загружает эмулированный регистр Y с (i) средним значением.

Через некоторое время я обнаружил, что немецкий парень, Андре Адриан, взял мой код и добавил интерфейс, позволяющий выводить код из современного графического интерфейса шахмат. Довольно круто, мне жаль, что я не подумал об этом. Это можно увидеть на его веб-сайте;

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

На той же странице (я использую google translate) он ссылается на оригинальную версию Sargon, еще одной классической шахматной программы, возможно, классической классики ретро, ​​и выражает желание, чтобы кто-то вернул этот код так же Я сделал это с помощью Microchess (я думаю, что то, что говорит перевод google). Ну, ладно, я здесь, чтобы служить! На этот раз я не буду пренебрегать добавлением интерфейса GUI, или, может быть, я буду сотрудничать с Андре.

Язык ассемблера Саргона находится здесь;

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

Andre удалил все постороннее и оставил здесь только код языка ассемблера;

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

Теперь сюжет сгущается. Андре пытался заставить этот материал работать сам с помощью эмулятора. (Edit 3jan2012 - Andre продвинул это вперед много, и теперь вы можете запустить старый код Sargon на современном ПК - см. Его ответ ниже и его веб-сайт, приведенный выше). Но есть осложнения, которые я не думаю, что он понимает. Код Sargon на самом деле нацелен на Z80. Но язык ассемблера не является нормальным сборщиком Z80, вместо этого он представляет собой сборку 8080, со странной мнемоникой Intel для использования только для Z80. Некоторые предпосылки; Zilog Z80 является сторонним потомком Intel 8080. Он использует двоичную совместимую надмножество набора инструкций 8080. Zilog решил предоставить более чистый, более ортогональный, но совершенно другой (на исходном уровне) язык ассемблера для Z80. Третья (четвертая?) Сторона четко решила, что это было плохое решение, и сделал альтернативный ассемблер Intel Z80, с расширениями Z80, выраженными в Intel как мода. Или, может быть, они просто добавили расширения Z80, используя средство макросов существующего ассемблера 8080. Это не имеет значения; Усложнение состоит в том, что Sargon-код использует этот довольно странный гибридный ассемблер.

Есть несколько причин, по которым я хочу использовать транслятор от 8080 до x86, а не эмуляцию Z80 или повторение подхода C Macro из моего проекта Microchess;

1) На этот раз намного больше кода. Если возможно, мне бы хотелось избежать линейного редактирования, даже если это минимальное преобразование.

2) Я бы хотел, чтобы на этот раз код работал на полной скорости. Мне кажется, что я могу увеличить глубину поиска, что я не мог сделать с Microchess. Шахматный код ест циклы процессора, он принимает столько, сколько вы можете дать, а затем хочет больше.

3) Даже если бы у меня было удобное решение для эмуляции, мне нужно было собрать этот материал, что является проблемой, учитывая странное соглашение ассемблера. Но если я могу перевести все 8080 мнемоники на x86, то я могу работать удобно на земле x86 и просто вручную перевести линии размером до 10% или около того в эквивалентный x86-код.

Извините за этот бессвязный пост. Надеюсь, по крайней мере один человек найдет это интересным. Еще один запрос; Я хотел бы получить благословение Дэна и Кэте Спраклен, легендарных программистов Саргона. Но у них, похоже, нет присутствия в Интернете. Дэн Спраклен находится в LinkedIn, но, похоже, это мертвый, безответственный аккаунт. Если кто-нибудь знает этих людей или как их связаться, пожалуйста, дайте мне знать.

Ответы

Ответ 1

Должен ли вы на самом деле перевести код, или достаточно emulator? Там даже один написан в Javascript!

Ответ 2

Возможно, вы захотите рассмотреть несколько альтернатив. Один из них был бы статическим двоичным переводом на C, это, вероятно, проще, если вы соберете код 8080 в двоичный файл. Не видя свой код, у вас могут возникнуть проблемы, поскольку это не одна-единственная вещь. Ресурсы в 8080 году или на панели, на которой он работал, не соответствуют 8086, на котором вы планируете запускать свой код. Если вы переводите на C, вы можете настроить таргетинг на все сейчас или в настоящем и не ограничиваться x86 в среде моделирования, чтобы покрыть предыдущую проблему. Это не так страшно или болезненно, как может показаться... На самом деле весело.

Что-то, о чем я думал, - это переводить на C перевод на llvm bytecode.

EDIT:

Проблема с ассемблером для ассемблера, не связанная с этим повторением в какой-то день, не является функциональностью инструкций (регистр A = регистр A + 1), но флаги и условные ветки (регистр A = регистр A + 1, если A == 0 Z = 1 else Z = 0,...). Основываясь на вашем понимании 8080 vs Z80, вы знаете, что вам нужно будет найти или создать инструмент, который может анализировать этот ассемблер. Моя теория заключается в том, что вы с большей вероятностью найдете ассемблера для двоичного кода, чем инструмент преобразования. Из двоичного кода вы можете эмулировать (намного больше полной скорости) или делать статический двоичный перевод, в идеале - C. С C вы можете быть неаккуратным, вы можете иметь каждую команду с кодом для обновления флагов, а затем оптимизатора в C компилятор может удалить мертвый код. Что-то ассемблер не собирается делать, оставляя вам массу неиспользованных инструкций, переходя прямо к x86. Я не читал руководство или слишком много кода, поэтому его можно легко обрабатывать, но в дополнение к отдельным инструкциям есть вопрос о стеке, памяти и регистрах и пользовательском интерфейсе. Если бы это использовало графический/видеоинтерфейс, вам пришлось бы заменить этот код оптовой, если стеки варьируются между 8080 и x86, тогда вам придется обрабатывать это, и, вероятно, будут жестко запрограммированные адреса памяти, которые вы с которыми придется иметь дело. Жестко закодированные легко вычислить, гораздо сложнее, прыгать таблицы и тому подобное. Как стек используется для передачи параметров, и вызовы могут различаться между процессорами, и автор может выполнить очистку стека таким образом, чтобы он не переводил инструкцию для команды. Это все, что я ударил, когда я сделал ассемблер для перевода ассемблера, предоставил его не от процессора дедушки и бабушки до внука, например 8080 х86. Я стал пинать и кричать, но в конце концов увидел это, по крайней мере, на мой взгляд, перевод на C, охватывающий многие из этих проблем. Я готов поспорить, исходя из того, что вы сказали о вариантах 8080 от z80, вам, возможно, придется писать свой собственный анализатор сборок. И здесь задача кажется невероятно огромной, ассемблером или статическим переводчиком, когда вы начинаете думать о том, сколько инструкций есть, сколько вариантов. Но как только вы входите в это, инструкции по шлифованию не так уж плохи.

Я понимаю, что мой ответ напрямую не связан с вопросом, вопрос в том, где я могу найти этот инструмент. Мой ответ связан с: если вы не найдете инструмент тогда. Если вы найдете инструмент, то хорошо, сделайте. Если вы найдете инструмент, который закроет вас, вы можете отрегулировать или настроить программу оттуда. Поскольку я делал это раньше нескольких раз, я знаю, что полный перевод может быть интересным проектом, особенно если ретро-программа - это то, что вам нужно, чтобы перейти к настоящему.

Ответ 3

http://www.arrakis.es/~ninsesabe/pasmo/ "Начиная с версии 0.5.0, можно также генерировать код 8086 из источников Z80, в двоичном формате для COM файлов Ms-dos или в формате CMD в формате CP/M 86". Pasmo 0.6: "Теперь можно скомпоновать код 8080 или смешать с Z80".

Ответ 4

Исходный код Sargon теперь запускается на эмуляторе CP/M. Вот источник, перенесенный с Wavemate Jupiter III на CP/M

Здесь доступен эмулятор CPM

Для сборки источника вам понадобятся TDL ZASM и TDL Linker. Они доступны здесь.

Команды создания Sargon в окне консоли MS-Windows:

cpm ZASM_TDL sargon

cpm tdl-link sargon

cpm sargon

Ответ 5

Как представляется, коммерческий переводчик 8080 - 8086 доступен как часть пакета здесь.

Ответ 6

Общая информация. Набор инструкций 8086 был разработан специально, чтобы упростить перевод с 8080. Вот как это делается, например, инструкции SAHF/LAHF.

Ответ 7

Можете ли вы собрать источник Z80 в двоичный файл? Если это так, то запустите дизассемблер на двоичном диске обратно на "обычный" ассемблер Z80.