Где я могу найти инструмент для преобразования ассемблера 8080 в x86?
Для проекта ретро-вычислений мне нужно перевести тело ассемблера языка 8080-х годов 1970-х годов в форму x86. Было время, когда именно этот инструмент был ключевой частью маркетинга Intel по внедрению семейства 80x86. Но мои навыки поиска в Google не подходят для поиска этого оригинального инструмента или чего-то подобного. Кто-нибудь знает, доступен ли такой инструмент где-нибудь?
РЕДАКТИРОВАТЬ
Я решил добавить некоторую справочную информацию, чтобы было яснее, что я пытаюсь сделать. Это для общего интереса, а также, возможно, дразнить еще несколько отзывов.
В предыдущем проекте я взглянул на шахматную программу эпохи 1970-х годов Microchess, и с благословения автора Питер Дженнингс запустил ее на современных машинах. Питер рассказал историю Microchess на своем сайте и предоставил 6502 источника ассемблера. Мой вклад был добавлен в историю, и его можно найти по адресу;
http://benlo.com/microchess/microchess9.html
То, как я занялся этим проектом, заключалось в минимальном преобразовании кода вручную, чтобы он соответствовал семантике языка Си, например, я преобразовал это;
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)mmediate.
Некоторое время спустя я обнаружил, что немецкий парень, Андре Адриан, взял мой код и добавил интерфейс, позволяющий запускать код из современного шахматного графического интерфейса. Довольно круто, я бы хотел подумать об этом. Это можно увидеть на его сайте;
http://www.andreadrian.de/schach/index.html
На той же странице (я использую Google Translate) он ссылается на оригинальную версию Sargon, еще одной классической шахматной программы, возможно, классической ретро-шахматной игры, и выражает желание, чтобы кто-то вернул этот код к жизни так же, как я делал с Microchess (я думаю, это то, что гугл переводчик говорит в любом случае). Ну, ладно, я здесь, чтобы служить! На этот раз я не забуду добавить графический интерфейс, или, возможно, я буду сотрудничать с Андре.
Язык ассемблера Sargon здесь;
http://web.archive.org/web/20040217034933/madscientistroom.org/chm/Sargon.html
Андре удалил все постороннее и оставил здесь только код на ассемблере;
http://www.andreadrian.de/schach/sargon.asm
Теперь сюжет утолщается. Андре пытался заставить этот материал работать сам, используя эмулятор. (Edit 3jan2012 - Андре много продвинулся вперед, и теперь вы можете запускать старый код Sargon на современном ПК - см. Его ответ ниже и его сайт, связанный выше). Но есть осложнение, я не думаю, что он понимает. Код Саргона фактически нацелен на Z80. Но язык ассемблера - это не обычная сборка Z80, а сборка 8080, со странной мнемоникой в стиле Intel только для интуиций Z80. Некоторый фон; Zilog Z80 является сторонним потомком Intel 8080. Он использует двоичный совместимый расширенный набор команд 8080. Zilog решил предоставить более чистый, более ортогональный, но совершенно другой (на исходном уровне) язык ассемблера для Z80. Третья (четвертая?) Сторона явно решила, что это плохое решение, и сделала альтернативный ассемблер Z80 в стиле Intel с расширениями Z80, выраженными в стиле Intel. Или, может быть, они просто добавили расширения Z80, используя макрос существующего ассемблера 8080. Это не имеет значения; Сложность состоит в том, что код Sargon использует этот довольно странный гибридный ассемблер.
Есть несколько причин, по которым мне нужен переводчик с 8080 на x86, а не эмуляция Z80 или повторение подхода C Macro из моего проекта Microchess;
1) На этот раз кода намного больше. Если возможно, я бы хотел избежать построчного редактирования, даже если это минимальное преобразование.
2) Я бы хотел, чтобы на этот раз код работал на полной скорости. Мне кажется, что я могу увеличить глубину поиска, чего я не мог сделать с Microchess. Шахматный код съедает циклы процессора, он берет столько, сколько вы можете дать, а затем хочет больше.
3) Даже если бы у меня было удобное решение для эмуляции, мне нужно было бы собрать этот материал для сборки, что является проблемой, учитывая странное соглашение на ассемблере. Но если я смогу перевести всю мнемонику 8080 в x86, то смогу комфортно работать на земле x86 и просто вручную перевести примерно 10% строк расширения Z80 в эквивалентный код x86.
Извините за этот бессвязный пост. Надеюсь, по крайней мере один человек найдет это интересным. Еще один запрос; Я бы хотел получить благословение Дэна и Кате Спраклен, легендарных программистов на Sargon. Но они, кажется, не имеют веб-присутствия вообще. Дэн Спраклен находится на LinkedIn, но кажется, что он мертвый, не отвечает. Если кто-нибудь знает этих людей или как с ними связаться, пожалуйста, дайте мне знать.
7 ответов
Исходный код Sargon теперь работает на эмуляторе CP/M. Вот источник, портированный с Wavemate Jupiter III на CP/M
Для сборки источника вам понадобятся TDL ZASM и TDL Linker. Они доступны здесь.
Команды для создания Sargon в окне консоли MS-Windows:
cpm ZASM_TDL sargon
cpm tdl-link sargon
cpm sargon
http://www.arrakis.es/~ninsesabe/pasmo/"Начиная с версии 0.5.0, можно также генерировать код 8086 из источников Z80, в двоичном формате для файлов Ms-dos COM или в формате CP/M 86 CMD." Pasmo 0.6: "Теперь можно собрать код 8080 вместо Z80 или смешать его с ним".
Общая информация. Набор инструкций 8086 был специально разработан для упрощения перевода с 8080. Именно отсюда, например, происходят инструкции SAHF/LAHF.
Возможно, вы захотите рассмотреть несколько альтернатив. Одним из них может быть статический двоичный перевод на 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. Я продолжал бить ногами и кричать, но в конце концов увидел, что, по крайней мере, на мой взгляд, перевод на С охватывает многие из этих проблем. Готов поспорить, исходя из того, что вы сказали о вариациях 8080 от z80, вам, возможно, придется в любом случае написать свой собственный анализатор сборок. Здесь опять задача кажется невероятно огромной, ассемблер или статический переводчик, когда вы начинаете думать о том, сколько инструкций, сколько вариаций. Но как только вы попали в него, проработка инструкций не так уж и плоха.
Я понимаю, что мой ответ не связан напрямую с вопросом, вопрос в том, где я могу найти этот инструмент. Мой ответ связан с: если вы не нашли инструмент, то. Если вы найдете инструмент, то хорошо, готово. Если вы найдете инструмент, который приближает вас, вы можете от руки или программно отрегулировать его оттуда. Поскольку я делал это раньше несколько раз, я знаю, что полный перевод может быть забавным проектом, особенно если ретро-программа является той, о которой вы заботитесь достаточно, чтобы перейти в настоящее.
Должны ли вы на самом деле переводить код, или эмулятор будет достаточно? Там даже один написан на Javascript!
Можете ли вы собрать исходный код Z80 в двоичный файл? Если это так, то запустите дизассемблер на двоичном компьютере до "нормального" ассемблера Z80.
Похоже, здесь есть коммерческий переводчик с 8080 по 8086, доступный как часть пакета.