-
Предыстория
Первой ПЗУ со страничной организацией, которую я дизассемблировал, была от MXV-11. Затем был дизасм ПЗУ от KDJ11-B, потом была попытка дизасма ПЗУ от M11.. Вроде как-то так. Но на M11 слегка обломался, потому что там был использован немного нестандартный подход - не весь код бы размещён на страница одинакового размера, часть кода копировалось в ОЗУ (причём не все слова подряд) и мой первый подход не позволил по быстрому разобраться с (такими) ПЗУ.
То, как делал первоначально - исходный файл ПЗУ распиливался на отдельные страницы, потом каждая страницы дизасмилась, после чего ручками по одной страницы я это всё дело сшивал в исходник, который после компиляции-сборки на выходе давал идентичный исходному двоичный файл. В процессе так же немного разбирался с логикой работы. Процесс длительный, монотонный и с массой ручной работы. Но в принципе - рабочий вариант
Затем появился DisAsm и некоторое количество ручной работы испарилось - знай, смотри в окошки и тыкай кнопсы.
В какой-то момент времени решил добавить поддержку страничных ПЗУ в DisAsm. Первый подход к снаряду, собственно, и реализовывал вышеописанный подход, только стало ещё меньше ручной работы. Плюс - учитывая поддержку в DisAsm макросов - смог сделать автоматическое отслеживание почти для всех сценариев - куда собрался (на какую страницу) перейти код. Но - сшивание отдельных частей - всё ещё ручная работа. Плюс - надо было поправить метки, ибо они генерировались без учёта того, что будет единый файл. То есть - ручной работы стало меньше, но она ещё осталась.
Получив первый (и неполный вариант), как я уже писал - пришло понимание - куда двигаться дальше.
Итак - первый (в бОльшей степени ещё концепт)-вариант поддержки страничных ПЗУ: встречаем
Теперь все страницы - в едином файле и даже какие-то результаты (по адресу M00262 - переход на другую страницу) уже просматриваются. Исходное адресное пространство бьётся (по описанию в файле настроек) на отдельные страницы, можно задавать размер и базовый адрес каждой страницы.
Что в работе - правильная генерация меток (тут уже более-менее) и правильная генерация операндов (с учётом того, что часть кода НЕ ПЕРЕМЕЩАЕМАЯ и будет располагаться совсем по другим адресам. В прошлом варианте корректировалось макросами, в этом варианте будет (пока никак не реализовано) корректироваться операндами-выражениями. Конкретный пример того, что сейчас будет оттранслировано не корректно - команда MOV по адресу 175266.
Работа продолжается
-
Уф.. Первые РЕАЛЬНЫЕ результаты :) То есть - после нажатия кнопки "Сгенерировать MAC" на выходе получаем исходник, которые с некоторыми доработками (добавить ссылку на файл макро-определений и убрать неправильные (работаю над этим) .=175000) ТРАНСЛИРУЕТСЯ, СОБИРАЕТСЯ и даёт ИДЕНТИЧНЫЙ исходному файл :)
Загрузили, ткнули "Макрокоманда?" для вставки макроса начала страницы
На ячейке 175200 ткнули P - получили ссылку на ячейку (правое верхнее окно) - неправильную - ибо на другой странице
"Макрокоманда?" для вставки макроса перехода на другую страницу - и теперь ссылка правильная
Страшные выражения как аргумент - как раз и позволяют сгенерировать правильные данные, так как в исходнике, с точки зрения MACRO-11 ячейка находится по адресу 1024, но реально она будет на другой странице и по адресу 175024
Теперь DisAsm начал понимать такие извращения и генерировать правильный аргумент
Не знаю пока - сколько ещё мест в DisAsm надо поправить, что бы он ВСЕГДА генерировал правильные ссылки и аргументы, но сейчас начинается уже этап целевого тестирования и исправления ошибок и неточностей, так как основа - есть. Ну и наведение красоты в показываемом :)
И да - существенную работу делают макросы, в частности, сейчас это (пока?) единственный способ подсказать DisAsm - о какой странице идёт речь :)
Так что такую красоту простым тыканьем кнопок (ну, может когда-нибудь, а пока) не получить - нужен предварительный анализ файла (можно в DisAsm-е же), составление файла описания секций (страниц), а затем подготовка шаблонов макросов для DisAsm и самих макросов для исходнка :) Кстати, для умеющих писать макро-определения и использовать макросы - всё не так уж и страшно :)
Технически - вариант с простым тыканьем кнопок тоже возможен, но его сначала надо продумать :) Но тут, увы, основной упор - в свободное время...
- - - Добавлено - - -
Поправил генерацию исходника. Теперь нужно только добавить ссылку на файл макросов.
Из занимательного - если где-то ссылка ведёт не туда, куда надо - есть шанс, что после сборки новый бинарник с исходным бинарником не совпадёт :) Особенность страничных ПЗУ :)
Немного потыкал кнопсы - результат идентичен оригинальному :)
- - - Добавлено - - -
Поправил генерацию исходника. Теперь нужно только добавить ссылку на файл макросов.
Из занимательного - если где-то ссылка ведёт не туда, куда надо - есть шанс, что после сборки новый бинарник с исходным бинарником не совпадёт :) Особенность страничныз ПЗУ :)
Немного потыкал кнопсы - результат идентичен оригинальному :)
-
Тэкс, красоту показываемого и генерируемго поправил. Может где ещё вылезет - по возникновению буду исправлять.
Начал тыкать кнопсы. Поправил определения макросов (к доработке под секции никаким боком). Потыкал и налетел на очередную ошибку. Лечу :) В смысле исправляю, а не в полёте :)
-
Чистка ошибок (точнее - неучтённых сценариев) продолжается. Пара ошибок генерации и штуки четыре макросов от прошлого подхода пришлось поправить, ибо - не так оно сейчас :) Похоже, скоро будет очередной коммит :)
-
Начал подтягивать оставшуюся часть ПЗУ. Там, по крайне мере вначале, идёт код, который используется для тестирования и для начала переносится в ОЗУ. И процесс переноса не совсем пока понятен. Такое впечатление, что вначале переносится часть кода, потом управление передаётся ей, а она ещё докопирует. Но надо разобраться в логике. Часть кода, которая переносится в ОЗУ - отображена как секция в DisAsm и по крайне мере можно анализировать код. Ну и теперь проверка на совпадения с исходым бинарником тривиальна - генерирую новый исходник, собираю, сравниваю.
-
Помимо доработок по работе со секционированными (язык не поворачивается сказать - страничными - ибо в этом ПЗУ большая их часть разного размера и большая же их часть грузится в ОЗУ для работы) ПЗУ - "распилил" таки его на составные части. Созданный (без дизасма) исходник генерирует идентичный двоичный файл.
Теперь опять доработка работы с секциями - ибо там СТРАШНОЕ в плане ссылок...
- - - Добавлено - - -
Свободного времени, как обычно, катастрофически мало, но с 14-ого в отпуске на две недели - попробую добить и ПЗУ и функционал :)
-
Посмотрев на (промежуточный) результат и подумав, понял, что ошибался. Страницы всё таки есть :) То есть Физическая структура (страницы, одного размера, отображаются через "окно") и Логическая структура. И всё ссылки через "номер секции" - они на самом деле ссылки через номер страницы. Но в некоторых случая вылезают и секции. Работаю дальше :)
-
Физическая структура добавлена и "вписана" в модель структуры DisAsm-11 до варианта, когда на выходе получается уже более-менее вменяемый файл, который транслируется, собирается и проходит сравнение с исходником. Безусловно, какие-то ошибки в логике ещё возможны, что будет выявляться тестированием.
На очереди - работа с (логическими) секциями, которые копируются в ОЗУ и являются взаимосвязанными - то есть из одной секции возможно обращение к коду или данным другой.
Шаг первый - организовать взаимосвязь, шаг второй - генерация ссылок.
-
Пока чистка от ошибок непредусмотренных сценриев и неправильных предположений. А так же пару мест зачистил со странным кодом - могу только предположить - остатки от кода для старой структуры объектов дизасма..
-
Взаимосвязанные секции пока не даются - не могу придумать простой способ описания связи их как объектов в DisAsm. То есть в принципе способы есть, но все получаются или громоздкие или потребуют много кода или переделок. Не хотелось бы...
Пока укладывается в голове, решил проверить - а как (после переделок) с другими типами файлов - много ли сломалось :) Взял (наверное самый тяжеловесный и не до конца доделанный) образ RSX-11M-Plus. Как ни странно, но додедалать и переделать пришлось немного. Но - есть ошибки в генерации кода (по сравнению с предыдущим вариантом). Фиксю..