Предыстория
Первой ПЗУ со страничной организацией, которую я дизассемблировал, была от MXV-11. Затем был дизасм ПЗУ от KDJ11-B, потом была попытка дизасма ПЗУ от M11.. Вроде как-то так. Но на M11 слегка обломался, потому что там был использован немного нестандартный подход - не весь код бы размещён на страница одинакового размера, часть кода копировалось в ОЗУ (причём не все слова подряд) и мой первый подход не позволил по быстрому разобраться с (такими) ПЗУ.
То, как делал первоначально - исходный файл ПЗУ распиливался на отдельные страницы, потом каждая страницы дизасмилась, после чего ручками по одной страницы я это всё дело сшивал в исходник, который после компиляции-сборки на выходе давал идентичный исходному двоичный файл. В процессе так же немного разбирался с логикой работы. Процесс длительный, монотонный и с массой ручной работы. Но в принципе - рабочий вариант
Затем появился DisAsm и некоторое количество ручной работы испарилось - знай, смотри в окошки и тыкай кнопсы.
В какой-то момент времени решил добавить поддержку страничных ПЗУ в DisAsm. Первый подход к снаряду, собственно, и реализовывал вышеописанный подход, только стало ещё меньше ручной работы. Плюс - учитывая поддержку в DisAsm макросов - смог сделать автоматическое отслеживание почти для всех сценариев - куда собрался (на какую страницу) перейти код. Но - сшивание отдельных частей - всё ещё ручная работа. Плюс - надо было поправить метки, ибо они генерировались без учёта того, что будет единый файл. То есть - ручной работы стало меньше, но она ещё осталась.
Получив первый (и неполный вариант), как я уже писал - пришло понимание - куда двигаться дальше.
Итак - первый (в бОльшей степени ещё концепт)-вариант поддержки страничных ПЗУ: встречаем
Теперь все страницы - в едином файле и даже какие-то результаты (по адресу M00262 - переход на другую страницу) уже просматриваются. Исходное адресное пространство бьётся (по описанию в файле настроек) на отдельные страницы, можно задавать размер и базовый адрес каждой страницы.
Что в работе - правильная генерация меток (тут уже более-менее) и правильная генерация операндов (с учётом того, что часть кода НЕ ПЕРЕМЕЩАЕМАЯ и будет располагаться совсем по другим адресам. В прошлом варианте корректировалось макросами, в этом варианте будет (пока никак не реализовано) корректироваться операндами-выражениями. Конкретный пример того, что сейчас будет оттранслировано не корректно - команда MOV по адресу 175266.
Работа продолжается




Ответить с цитированием