Декомпилятор микрокода К145ИК13

Который использовался для ПМК МК-61 и других подобных ПМК. Оптимизация ещё не доделана поэтому много мусора. Но код работает, так же требуется ручная оптимизация. Теперь эмулятор в 100 раз быстрей, можно сделать аппаратный эмулятор на слабом МК.

Источник: форум WASM

Неплохая работа. Сразу подняла уровень еггогологии. Зачем таскать эмулятор, если можно перевести микрокод в Си?

Со временем, возможно, получится оптимизировать код ПМК и привести к виду, читабельному человеком. Ну и вопрос, будет ли МК61S переходить на этот новый уровень.

оптимизировать?

«Декомпилятор» переводит микрокод в программу на Си. Он не эмулирует железо и возню с битами микрокоманд, а работает с 4-битными сущностями:

У нас следующие объекты; 3 процессора у которых 256 команд-функций, а так же есть массив регистров R[42], ST[42](это просто стек, точней 14 штук 3-х уровневых стеков), регистры S, S1, флаг переполнения Carry. Есть ещё флаг P нажатой клавишы. И основная кольцевая память, представляет из себя массив-структуру M[15][42], точней M[15][14][3]. Ну и так же есть порты ввода port_a, port_b, и вывода - это 7-ми сегментный 12-ти разрядный индикатор.

Грубо говоря, считывание, разбор и интерпретация микрокоманд осуществляется один раз на этапе «декомпиляции», а не во время каждого исполнения. Есть ещё небольшая, но перспективная оптимизация получившегося кода на Си.

а тесты какие-то написаны, сравнить результаты "декомпилятора" и "классического" эмулятора?

Если отличия есть, то ценность первого для меня лично стремительно упадёт

Отличий не должно быть. Ведь за основу ВЭ (Высокоуровневого Эмулятора) берётся тот же самый микрокод. Точнее, если отличия будут обнаружены, это существенно обогатит наше знание ПМК.

Конечно, хорошо бы все тесты автоматизировать. Это позволит проверять корректность оптимизации.

Ну, было бы интересно посмотреть хотя бы на РС эмуляторе разницу в скорости работы. Пока что есть моменты, которые настораживают. Навскидку:
1. Автор упоминает линию акустической задержки в оригинальном железе. WAT?
2. Исходник с расширением .cpp, хотя внутри просто Си
3. Имена переменных содержат русские буквы - как минимум, код сразу не собирается без напильника.
4. Кто-то в чате задался вопросом, который возник у меня тоже:

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

1. Без комментариев.
2. Это не проблема. Си это подмножество C++. Код, скорее всего, предназначен для gcc.
3. Компилировать декомпилятор не пробовал. Просмотрел глазами код ещё раз, переменные названы на английском.
4. Вопрос от незнания. Странно, что он здесь возник.

Микрокод ИК13 небольшого размера, но сложен для восприятия. На данный момент нет живых людей, его изучивших. Авторы микрокода умерли. Вместе с тем понимание, что он делает, у владельцев ПМК есть. Можно сравнивать поведение ВЭ хоть с советскими ПМК, хоть с эмулятором.

Двойной работы тут нет. Наоборот, декомпилятор позволяет создать большой «сырой» код ВЭ, упрощая который можно разобраться, как работает микрокод.

1. Я тоже не знаю, о чем это, возможно, автор так проиллюстрировал кольцевую шину.
2. Не проблема, естественно, я просто собрал для кучи
3. А я пробовал. В имени некоторых переменных не Ascii символы - типа вместо getSumA написано getSumА, где А - русская буква. Это признак того, что автор, как минимум, не проверил, что он "вывалил" в мир.

В общем, если у кого есть желание и время изучать это, добро пожаловать, я не проникся.

Вопрос ещё, что на выходе декомпилятора — работающая программа на Си или псевдокод. Я как-то некритично воспринял заявление автора «Теперь эмулятор в 100 раз быстрей, можно сделать аппаратный эмулятор на слабом МК.» Скорее всего, заявление «код работает» относится к самому декомпилятору, а не результату его работы.

Пока это всё не выглядит, как работающий проект. Если же английские буквы подменяют русскими, это не обязательно злонамеренность. Например, эмулятор на JavaScript в верхнем правом уголке этого сайта использует русские идентификаторы.

Само направление перспективное. Если у кого заработает транслированный микрокод, это действительно снизит требования для камня, на котором можно эмулировать советские ПМК.

Я собрал это чудо инженерной мысли. Оно производит Си файл размером 739 Кбайт на 49050 строк кода (отдельный привет тем, кто будет это впихивать в микроконтроллеры). Зип файл Си файла тут:

C:\...\Downloads\CompilerMicroCode(0.02)\bin\Debug>mk61decomp.exe
Compilation of a microcode for the processor K145IK13
Using: CompilerMicroCode_K145IK13 nameFile [flags]
C:\...\Downloads\CompilerMicroCode(0.02)\bin\Debug>mk61decomp.exe outFile.c
Compilation of a microcode for the processor K145IK13
Create file 'outFile.c'
DONE!

P.S. Си файл, на самом деле, Си Плюс Плюс - функции в сгенерированном файле принадлежат своим классам.

49к строк это же максимум, начальный размер. Главное, чтобы это чудо откомпилировалось и заработало. Дальше пойдёт оптимизация и выкидывание мусора. Например, 22 строки из начала:

 case 0x01: //IK1302  1
		sum = pM[4];
		S = sum;
		sum = pM[7];
		S = sum;
		sum = pM[10];
		S = sum;
		sum = pM[13];
		S = sum;
		sum = pM[16];
		S = sum;
		sum = pM[19];
		S = sum;
		sum = pM[22];
		S = sum;
		sum = S + 1;
		Carry = sum >> 4;
		S = sum & 0xF;
		sum = 4;
		S = sum;
		sum = INV4(S);
		S = sum; 

легко оптимизируются в 4 строчки:

 case 0x01: //IK1302  1
		Carry = (pM[22] + 1) >> 4;
		sum = INV4(4);
		S = sum; 

С такой плотностью кода весь ВЭ сожмётся в меньше, чем 9к строк. Спасибо за зип!

Не за что! Удачи в дальнейшем исследовании, было бы интересно сравнить с "классическим" эмулятором

Всем привет!
Я автор этого декомпилятора. Сейчас работаю над улучшением декомпилятора и эмулятора. Основа кода взята тут mk-61.moy.su. Код эмулятора и улучшенного декомпилятора выложу позже.

Здравствуйте ещё раз. Это ваш эмулятор работает на этом сайте?

Моё почтение за декомпилятор. Это востребованный и давно назревший проект. Мало кто обладает опытом, достаточным для его осуществления. Мы все с нетерпением ждём эмулятора на её основе. Если поможет, можете использовать Вики по ПМК для структурирования информации по ИК13 и микрокоду ПМК:

https://pmk.the-hacker.ru/ИК13

Обсуждение декомпилятора микрокода на КЛК, с примерами:
http://www.leningrad.su/calc/cforum.php?topicid=2446

Наконец-то смог запустить свой декомпилированный код. Он немного раздулся, файл был 20 кб стал 161, потом оптим. на мин. размер 145 кб. Но про анализировал код IDAPro, немного переделал, оптимизировал, сейчас 79-79.5 кб. Так что в МК с 64 кб ПЗУ и 1-2 кб ОЗУ вполне влезет

Как 80 КБ кода под CISC процессор влезут 64 КБ памяти RISC процессоров?

Если декомпилировать в псевдокод, оптимизировать вручную и потом перевести в ассемблер — может влезть. Микрокод оперирует очень низкоуровневыми сущностями, которые потом приходится реализовывать на Си, что не оптимально. На форуме wasm было авторское пояснение. Если он виден из-за границы, можете сами процитировать.

Из России форум лежит, уже второй день минимум. Даже не знаю, это проблема самого форума или захватившие Россию варвары опять навандалили по крупному и порушили что-то в Сети, как во время бодания с телегой.

Точная цитата разработчика декомпилятора:

Возможно надо декомпилировать не в С/С++, а в условный ассемблер, там много функций десятичной коррекций используется и вычитания методом ~A++, в результате код получается не слишком оптимизированным.

Мой «псевдокод» уважаемый Intro называет «условным ассемблером».

Сделал оптимизатор, который выбрасывает не использованные выражения. Теперь надо сделать предвычисления выражения. А потом ещё некоторую оптимизацию сделать.
Хотя оптимизатор компилятора С++ может это делать хорошо, но лучше самому это сделать, чтобы код легче понимался. Кроме того оптимизатор С/С++ не может сделать некоторую оптимизацию. Да и предварительно оптимизированный код позволит использовать хреновые компиляторы С/С++. Для МК не все компиляторы могут оптимизировать код на уровне VS2010.
Да, я использую студию 2010, gcc пока не пробовал, даже пока не устанавливал, потом.

Верно мыслите. Если генерируемый код подразумевает чтение человеком, то он должен быть максимально понятен, все элементы обфускации изъяты, как и неиспользуемые/пустые фрагменты и "болванки".

А есть ли уже рабочий код эмулятора, попробовать в МК61S?

Начал тестировать оптимизирующий декомпилятор, вылезла куча ошибок. Придётся переделать код, там довольно хреново сделано.

Как насчёт компиляции прошивки ПМК в псевдокод, удобный для оптимизации? Ну а потом пропустить псевдокод через оптимизатор и компилятор в C++?

Разбить эту великую задачу на три этапа.