Вход

Просмотр полной версии : DisAsm-11



Страницы : [1] 2

Hunta
28.02.2021, 11:00
Пока большая часть моих программ - RequestWare, то есть, если что-то из написанного мной кому-то интересно, а у меня на недо-сайте не выложено - пишем в теме или в личку - обсуждаемо.

В очередной раз понадобилось дизассемблировать некий файл и оказалось, что дизассемблера под этот формат нет или я пока про него не знаю. Особенно учитывая, что это (фактически) .LDA, но вот хранится он в ФС типа DOS/Batch-11-овской и копия блоков файла получить без проблем, но вот на выходе - не совсем .LDA получается. Точнее, .LDA, но с добавками.

В общем, это было, видимо, последней каплей, и я таки сел клепать свой дизасм.

Тут дальше была инфа про минус первую версию, но поскольку с той поры прошло много написанного кода, я слегка подредактировал первоначальную версию :)

Картинки (http://www.KpXX.Ru/Soft/Utils/DisAsm11) (из за непонятной проблемы может прилетать ошибка - вроде помогает refresh. разбираюсь, но пока непонятно, что происходит)

"Учитывая, что разбор инструкций идёт по таблице, добить полный набор инструкций - дело ещё одного вечера, а вот потом начнётся самое интересное :)" - и я даже не знал тогда - насколько оно интересней :)

Подопытные кролики. Упоминание их здесь не означает, что работы по восстановлению доведена до конца, но можно посмотреть на результат работы DisAsm-11, когда программа загружалась

DESS (http://www.kpxx.ru/Soft/Utils/Dess)
Игрушка Stalk (http://www.kpxx.ru/Soft/Utils/Stalk)

Vslav
28.02.2021, 14:23
.LDA, но вот хранится он в ФС типа DOS/Batch-11-овской и копия блоков файла получить без проблем, но вот на выходе - не совсем .LDA получается.
.bic - это формат абсолютного загрузчика DEC, его обычный srec-cat умеет конвертировать в hex/bin или во что захочешь.
Я так .bic тестов для LSI-11 конвертил: "srec_cat file.bic -dec_binary -o file.bin -binary"
Вот тут я еще короткое описание формата выложил (https://github.com/1801BM1/cpu11/tree/master/lsi/tst/org)

Hunta
28.02.2021, 14:39
.bic - это формат двоичного загрузчика
Я это знаю (поэтому и написал - .LDA), но возиться с аддоном для TotalComand-ер и его прикручиванием к FAR-у - не стал (особенно учитывая, что FAR у меня 64-ёх битный, а аддон вроде 32-ух), учитывая, что в листинге XXDP виден и начальный блок и длина - в RT11 просто скопировал эти блоки в файл на HX, приаттаченный к папке Windows. И вот в таком файле есть нюанс - он не совсем .LDA, но с отличием разобрался влёт. Ну и на саму загрузку такого файла и его первоначальный парсинг структуры ушло... мм... минут 20(?) написания кода. Сделал бы быстрее, но посадил одну мааааленькую ошибку и с ней проколупался

В общем, сейчас доделываю первоначальное декодирование (полное описание таблицы декодирование и шоб оно шло сразу, при загрузке данных из .LDA), посмотрю, что получится, а потом буду писать анализатор - где код, где данные.. Для начала :)

- - - Добавлено - - -


Вот тут я еще короткое описание формата выложил
Да оно как бы есть и в доках на RT :) Там единственное только не совсем чётко описан байт контрольных сумм :) И из за ошибки в проге (как я думал) и из этого описания долго не мог понять - чего у меня КС получается нулевой :) Только потом дошло, что я на автомате написал правильный вариант подсчёта КС и при правильной КС ноль и должен получаться :D

Vslav
28.02.2021, 14:40
В общем, сейчас доделываю первоначальное декодирование
Преобразованием формата должны заниматься утилиты-преобразователи. Когда попадается новый формат - я всегда на srec-cat смотрю сначала, до сих пор он практически все потребности закрывал. А писать дизассемблер для известного процессора.... Маловероятно что IDA получится превзойти.

Hunta
28.02.2021, 14:49
Преобразованием формата должны заниматься утилиты-преобразователи.
В моей проге это не преобразование формата - это считывание исходных данных. И если в случае с .LDA метаинфы почти нет, то в случае сложных .SAV и .TSK будет некоторое количество метаинформации, которая так же должна быть доступна и обрабатываться дизассемблером.


А писать дизассемблер для известного процессора.... Маловероятно что IDA получится превзойти.
Учитывая, что я люблю использовать структурные макросы - я это дело делаю с прицелом на них - и вот тут что то я сомневаюсь, что IDA мне выдаст такой исходник. Плюс. .SAV и .TSK файлы бывают с поддержкой оверлеев, I+D - как у IDA с этим?


Когда попадается новый формат - я всегда на srec-cat смотрю сначала, до сих пор он практически все потребности закрывал
Как насчёт .SAV с оверлеями и I+D? :)

- - - Добавлено - - -

В любом случае. Эту прогу я пишу под СВОИ потребности и смогу дорабатывать при их изменении. А поскольку меня интересует только один процессор (ну по крайне мере пока) - большая часть возможностей IDA мне как бы.. ни с какого бока. Плюс его платность и написание модулей расширения - на каком языке? На С или С++ - оба языка (особенно второй) не люблю.

Vslav
28.02.2021, 15:27
В моей проге это не преобразование формата - это считывание исходных данных.
И? Конвертировали LDA в HEX и загрузили в IDA.


И если в случае с .LDA метаинфы почти нет, то в случае сложных.
Все "метаданные" что там есть вполне описываются обычным Intel-Hex, ничего не теряется.



SAV и .TSK будет некоторое количество метаинформации, которая так же должна быть доступна и обрабатываться дизассемблером.

А что, DISS не справится с .SAV ? Для RSX тоже есть дизассемблер. И изначально про SAV и TSK речи не было.



Учитывая, что я люблю использовать структурные макросы - я это дело делаю с прицелом на них - и вот тут что то я сомневаюсь, что IDA мне выдаст такой исходник.

А ты не сомневайся, посмотри IDA SDK, там вполне вменяемый Питон, перевод в макросы сделать можно.



Плюс. .SAV и .TSK файлы бывают с поддержкой оверлеев, I+D - как у IDA с этим?

Для DOS x86 Borland и Microsoft поддерживаются "из каропки". Для других архитектур надо сделать парсер на Питоне.
Но это тебя совсем уж далеко занесло. И чего только люди не придумают лишь бы изобретение велосипеда оправдать :). Ну, дело твое.



большая часть возможностей IDA мне как бы.. ни с какого бока.

Дело не в возможностях. IDA это фреймворк, именно для построения интерактивных дизассемблеров, допиливается быстро.
Если процессор известен и предполагается большие время-затраты (ты сам тут про оверлеи начал рассказывать), то надо работать в нормальном инструменте.
Мне надо было микрокод LSI-11 разобрать, я знал что оно будет конечно (собственно там только три микросхемы и существуют ), а для IDA надо было делать целую новую архитектуру, поэтому я забил и сделал свое за неделю вечерами на Питоне (заодно попрактиковался на питоне, и половина кода потом ушла в Ассемблер), но пилить дизасм для PDP-11 - это только развлекать себя переизобретением велика :)

Hunta
28.02.2021, 16:04
DISS
Может - DESS?


И изначально про SAV и TSK речи не было.
А ты думал, я решил написать только для дизасм .LDA? Может ещё подумал - одного конкретного файла? Естественно прицел идёт на ВСЕ файлы (obj, sav, tsk, оверлейные, I+D) от XXDP, DOS/Batch-11, RT и RSX.


это только развлекать себя переизобретением велик
Аха. Люблю это дело. Ибо существующие - не устраивают и/или не нравятся.

- - - Добавлено - - -

А, да, ещё забыл про multiuser таски от RSX. А так же драйвера.

- - - Добавлено - - -


Если процессор известен и предполагается большие время-затраты (ты сам тут про оверлеи начал рассказывать), то надо работать в нормальном инструменте.
Вот я и не считаю для данной задачи его нормальным инструментом :)

Vslav
28.02.2021, 17:24
Вот я и не считаю для данной задачи его нормальным инструментом :)
Вы не любите кошек? Да Вы их просто готовить не умеете! :)
Ты сделай сначала что-нибудь хотя бы близкое по возможностям :)
PS. Я тебе завидую, у тебя есть время на велосипед.

Hunta
28.02.2021, 20:17
Ещё шаг вперёд. В парсер загнал почти все инструкции (остался FPP, пошерстить доки на предмет экзотики, ну и проверить корректность таблицы).
Так же декодирование идёт в процессе загрузки файла, поэтому кнопка декодировать не нужна

Всё ещё очень ранняя версия (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-002.jpg)

Hunta
01.03.2021, 14:23
Эволюционное развитие. Плюс некоторая внутренняя переработка с прицелом на логический анализатор.

По прежнему очень ранняя версия (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-003.jpg)

- - - Добавлено - - -

Проверка и демонстрация концепции. Сделано, конечно, пока кодом, ибо никакого пользовательского интерфейса нет и кнопка Анализировать для красоты, но. Визуализация содержимого ячейки основывается на её типа и было достаточно выставить нужный тип, что бы вместо кода получить... Получить то, что видно :) Технически даже сейчас - повесить на клавишу нужные действия (по выставлению типа ячейки) - и такое можно получить простыми щелчками по клавишам :) По сути - анализатор будет делать тоже самое :)

Ну, вы поняли, да? :) (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-004.jpg)

- - - Добавлено - - -

Совершенный ASCII декодер :) (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-005.jpg)
Надо ещё добавить тип ячейки .EVEN :)

Hunta
01.03.2021, 20:54
Проработка концепции меток :) (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-006.jpg)

- - - Добавлено - - -

Теперь метки в середине строк расставляются более правильно :) (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-007.jpg)

- - - Добавлено - - -

Продолжаем воевать с метками :) (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-008.jpg)

Hunta
02.03.2021, 09:58
Декодирование дошло до точки, когда уже можно сохранять в файл (кнопка Сохранить теперь работает) и проверять правильность обратного ассемблирования, сборки и сравнения с оригиналом :) Сохранение в файл позволило увидеть две достаточно грубые ошибки декодирования операндов в определённых режимах адресации - поправил.

Теперь буду выкладывать то, что получается при сохранении в файл на очередной доделке программы :)

Hunta
02.03.2021, 18:33
327

- - - Добавлено - - -

325

- - - Добавлено - - -

256

- - - Добавлено - - -

125

- - - Добавлено - - -

86

- - - Добавлено - - -

64

- - - Добавлено - - -

18

- - - Добавлено - - -

15 :)
К сожалению, эти 15 ошибок - ошибки класса Z, то есть инструкции, про которые MACRO-11 предупреждает, что они могу выполняться по разному на разных моделях PDP-11 - то есть это и не ошибки, а больше предупреждения...



.MACR ZKDJV2
Z 1449 004540 000120 JMP (R0)+
Z 1461 004562 000121 JMP (R1)+
Z 1469 004576 000122 JMP (R2)+
Z 1492 004652 000123 JMP (R3)+
Z 1500 004666 000124 JMP (R4)+
Z 1508 004704 000125 JMP (R5)+
Z 1527 004742 000126 JMP (SP)+
Z 1539 004766 000127 001127 JMP #1127
Z 2997 011626 000121 JMP (R1)+
Z 3227 012470 000127 000401 JMP #401
Z 3355 013046 004421 JSR R4, (R1)+
Z 3524 013532 004427 000240 JSR R4, #240
Z 6120 023704 030252 BIT R2, @-(R2)
Z 7302 027676 010222 MOV R2, (R2)+
Z 9332 037242 020252 CMP R2, @-(R2)
?MACRO-E-Errors detected: 15
DK:ZKDJV2=DK:ZKDJV2

.

Итак, код полученный из дизасма после добавления нескольких строк вначале


.TITLE TEST

.NLIST
.INCLUDE /KXX:ASCII.MAC/
.INCLUDE /KXX:HWDF.MAC/
.LIST

.ASECT
.=0

и в конце


.END


прошёл трансляцию MACRO-11, ну наверное можно считать - без ошибок с точки зрения MACRO-11 :) С точки зрения MACRO-11 - потому как есть предполагаемые метки, которых нет на их местах... О причинах догадываюсь, попробую поправить. Да, и надо поставить .DSABL GBL, так как это - всё таки ошибки - пусть и MACRO-11 так считает :)

- - - Добавлено - - -

Так что...

48 :)

- - - Добавлено - - -

26

- - - Добавлено - - -

21

- - - Добавлено - - -

Ха, а это выползла другая ошибка, команда PDP-11, про которую забыл :)

- - - Добавлено - - -

Ну, правда, и предыдущая - в паре мест...

- - - Добавлено - - -

17

Hunta
02.03.2021, 21:03
15 :)

Исходник (http://www.KpXX.Ru/Soft/Utils/DisAsm11/ZKDJV2-001.MAC)
Листинг (http://www.KpXX.Ru/Soft/Utils/DisAsm11/ZKDJV2-001.LST)

В исходнике есть несколько .ASCII/.ASCIZ блоков - они были описаны хардкодом в программе исключительно для отладки парсера .ASCII - пока функционала автоматического определения или ручного указания типа данных нет. Добавлю ручное, когда нарисую парсер для слов, байт и Radix50 :) Автоматическое - пока цель на будущее :)

- - - Добавлено - - -

Следующий шаг - добавлю загрузку простых .SAV файлов и образов памяти типа загрузчиков, содержимое ПЗУ - на них можно будет проверить не только ассемблирование, но результат линковки :)

- - - Добавлено - - -

Закомментировал хардкод блоков .ASCII/.ASCIZ - теперь ошибок 17, но все они Z

Hunta
03.03.2021, 10:15
Добавил загрузку двоичных файлов-образов. Первым под раздачу попал загрузочный сектор для RK от операционки DOS/Batch-11 :)

Переделал подход к декодирование – стал немного более интеллектульным :)
Плюс, немного пошаманил над генерацией меток.

Результат (подход пока единый – загрузить нечто в дизассемблер и выгрузить в файл)
Исходник (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DOSRK-001.MAC)
MACRO-11 не выдал ни одной ошибки :)
Листинг (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DOSRK-001.LST)

Позже гляну – что он сделает с .BIC файла теста

ra3qdp
03.03.2021, 15:28
интересно было бы реассемблировать ПЗУ от Т-11 или ПЗУ от ДВК, что бы получить исходник OTD.

Hunta
03.03.2021, 15:51
интересно было бы реассемблировать
Так в чём проблема - реассемблируйте. Проги и на PDP-11 и на PC есть.

Hunta
03.03.2021, 21:02
Игрался с программой. Много думал. Немного кодил :)

Hunta
04.03.2021, 20:04
Сделал нулевую версию анализатора (отслеживает ссылки из команд и ставит об этом метку на ячейках). Запуск можно сделать как с точки старта - при загрузке (если в файле есть такая инфа) или при ручном указании точки старта. Или запустить с текущего адреса.

И совсем отказался от подхода - тупо пробуем дизасмить всё подряд :)

Начал добавлять функционал ручных подсказок.

Теперь через интерфейс одним щелчком мыши (клавиатурные шоткаты грядут) (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-009.jpg)
как собрать строку (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-010.jpg)
так и распилить её в нужном месте (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-011.jpg)

Причём последнее может сделать и анализатор, если обнаружится ссылку внутрь строки. Всё, что для этого ему нужно - поставить флаг - на ячейку есть ссылка. Распил строки и расстановка меток будут сделаны автоматически :)

Некоторое время - на игры, исправление ошибок, доработку интерфейса и общения с программой, а потом сделаю сохранения текущего состояния процесса дизасма. Пока играюсь и отлаживаюсь на двух файлах, но ещё чуть чуть и программу уже можно будет использовать по назначению. И тогда без возможности прерваться с сохранение игрушки - будет тяжело :D

Hunta
06.03.2021, 21:54
Доработанный пользовательский интерфейс (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-012.jpg)

Гоняю третьего подопытного кролика. Цели – большее удобство использования, некоторые ковыряния с ASCII, некоторые ковыряния с метками, исправление ошибок :)

- - - Добавлено - - -

199

- - - Добавлено - - -

119

практически все - неопределённые метки :) Но есть и прикольные :) Где то я при декодировании команды забыл число вывести в восьмеричном виде и оно выплёвывается в десятичном. И всё бы ничего, но вот 8 и 9 MACRO-11 не нравятся :) Странно :D

- - - Добавлено - - -

В целом, всё ближе к проверке века - дизассмеблировать-ассемблировать-слинковать-сравнить с оригиналом :)

- - - Добавлено - - -

Первая версия программы, в которой я поправил косяк декодирования (данные были декодированы как код), сгенерил новый выходной файл и получил...

107

ошибок :) До этого момента я выходил из программы, правил её текст, запускал заново, повторял процедуру уточнения типов ячеек (в основном выделял строки, формировал указатели на данные и подпрограммы, подсказывал, что это данные, а это код) и заново генерил выходной файл :)

В целом программа всё ближе для боевого применения :)

goodboy
06.03.2021, 21:57
создание темы предполагает обсуждение, а такой поток сознания уместен скорее для `дневника` и такой формат есть на этом форуме

Hunta
06.03.2021, 22:04
создание темы предполагает обсуждение
Когда будет готова первая версия для нетепличных условий - тогда и посмотрим.
Сейчас обсуждать нечего.

Hunta
07.03.2021, 01:50
4 ошибки :) SOB и одна ещё связанная с парсингом строк, с ней ещё подумать надо...

- - - Добавлено - - -

Ноль.
После небольшого редактирования (сейчас .SAV файлы берутся как простые образы памяти, поэтому надо было вырезать нулевой блок, поправить ссылку на ячейку 44 - по имени JSW, подрезать конец - из .WORD 0 в .BLKW и для link-а указать /STACK) - компиляция + сборка на выходе дают идентичный исходному .SAV файл :)

Если есть желающие покопаться в дизасме DESS V05.10s, то исходники здесь (http://www.KpXX.Ru/Soft/Utils/DESS)

Небольшое уточнение - DESS.TXT надо переименовать в DESS.COM.

Hunta
07.03.2021, 13:19
Некоторая переделка внутренностей (снаружи всё практически то же самое) с прицелом на увеличение функционала подсказок.
Сгенерировал новый DESS.MAC. Обнаружил пересечение между описанием констант ASCII (символ с кодом 32(8)) и командой SUB. Поэтому выложен и обновлённый ASCII.MAC. Всё лежит там же (http://www.KpXX.Ru/Soft/Utils/DESS)

Hunta
07.03.2021, 22:52
Добавил функционал подсказок на аргументы команд. Теперь можно сделать не MOV 1000(R2), R1, а MOV L01000(R2), R1 :) Функционал доступен как человеку, так и анализатору. Но в нём ещё надо придумать, как это задействовать, так что использует только человек...

Некоторая косячность наблюдается с метками в ASCII строках. Не критическая, на DESS пришлось поправить две метки, но всё равно, надо продумать другую схему работы со ссылками.

Начал делать модуль разборки с метаинформацией в .SAV файлах, теперь программа (кое-что) знает про .SAV файлы, а не смотрит на них как на образы памяти.

Опять обновлённая версия DESS.MAC и слегка поправленный ASCII.MAC. Хотя над этой правкой ещё думаю.. Всё лежит там же (http://www.KpXX.Ru/Soft/Utils/DESS)

- - - Добавлено - - -

А, да, всё забываю написать :) Время изготовления этого файла (от начала до прохождения теста идентичности) - примерно 30 минут :) Раньше на такое у меня ушло бы дней пять :) С этим файлом уже можно начинать отрабатывать логику программы. Хотя я её уже в процессе дизассембла начал видеть :)

Hunta
09.03.2021, 00:54
Последствия игр с программой :) (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-013.jpg)
Встаешь на ячейку, видишь в среднем окне - а куда, возможно, её содержимое указывает...
О, да это код - щелчок по кнопке S - и в среднем окне уже видишь код :)
Если это команда с двумя аргументами, соответственно среднее окно для источника, правое - приёмника :) Если, конечно, потенциально это указатели :)
Пока ещё альфа-заготовка - то есть много для чего показа в правых окнах не будет, но...

Hunta
09.03.2021, 15:05
Встали на команду, справа видна ячейка, на которую команда ссылается - видим строку ASCII (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-014.jpg)
Перешли в правое окно, щёлкнули по клавише A - строка сформирована (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-015.jpg)
Перешли в левое окно, щелкнули по кнопке P - имеем ссылку в команде (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-016.jpg)

Можно анализировать дальше :)

Hunta
13.03.2021, 11:22
Вечерами ломал голову над внутренними переделками программы с прицелом на поддержку файлов программ с перекрытиями. Вроде как идеи обкатал в голове и вчера вечером закончил переделку - до реальной поддержки пока ещё далеко, но первый шаг сделан. После переделки было на удивление мало сбоев в работе - была пара месте, где не была сделана необходимая правка и с пяток правок, связанных с генерацией меток.

А потом, развлекаясь в дизассемблирование DESS-а, налетел на некорректную визуализацию ячеек с данными.

Вообще, (правильная) визуализация данных - с учётом того, что разные типы данных занимают разное количество слов, а то и байт, плюс к этому добавляется необходимость (правильной) генерации меток, в том числе байтовых - по ощущениям - одного порядка сложности с дизассемблированием команд. Но в командах сложное место фактически одно - понять - операнд - это число или адрес, да и то - есть некоторые подсказки.

Немножко пошаманил, теперь визуализация идёт более корректно.

Исходная картинка (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-017.jpg)

По адресу 11631 видим наличие строки, но младший байт - это терминатор предыдущей строки, а наша начинается на старшем байте. В предыдущей версии программы, если бы на этой ячейке выдал команду ASCIZ, то получил бы по адресу 11630 то же самое (.WORD 006400), потом много пустых строк (ибо символы ушли бы в .ASCIZ, которая начинается с 11631, но там - неправильная визуализация) и .WORD 0 по адресу 11662.

Теперь визуализация более корректная (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-018.jpg)

Похожая проблема с визуализацией ячеек, старший байт которых помечен как БАЙТ данных, а младший ни как не помечен

Снова более корректная визуализация (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-019.jpg)
А вот визуализация ячейки, оба байта которой помечены как БАЙТЫ (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-020.jpg)

Всё это привело к мысли, что надо бы подсвечивать пометки на словах и байтах, но для этого надо отказываться от простого текста в выводе окон результатов дизассемблирования, с чем пока не хочется связываться, гораздо проще сделать что то типа статусной строки, в которой будет выводится эта информация.

Hunta
14.03.2021, 00:55
Уф... ссылки теперь не только добавляются (метки появляются), но и удаляются (метка исчезает, если больше никто на ячейку не ссылается). По крайне мере все пришедшие мне сценарии проверил и добавил код.. Ещё добавить сохранение-восстановление состояния дизассемблирования - и версия 1.0 будет готова :) Возможно, так же в неё добавлю дизассемблирование простых .TSK файлов - формат у них с .SAV сильно похожий и надо бы добавить поддержку простых, а не сдампленных из XXDP .LDA файлов (есть там один нюансик, но формат тоже почти одинаков). Ещё сделал некоторые команды триггерными (типа - щёлкнул один раз - и вот указатель, щёлкнул второй раз - и снова простая ячейка)

Hunta
17.03.2021, 15:07
Допиливание будет долгим (ибо даже не сильно сложных в реализации задумок – много), но…

Минимально необходимый функционал (плюс реализованные задумки) – Е! (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-021.jpg)

Ошибки (точнее, недоделки из-за изменения внутренностей) ещё есть - гоняю тесты и выпиливаю их :)

Hunta
17.03.2021, 20:15
Я, конечно, понимаю, что тут мало кому нужен (ещё один) дизассмеблер, тем не менее, он уже подходит к состоянию, когда я могу выложить-дать его погонять, если у кого-то появиться интерес :) Но не настаиваю - делается он в первую и основную очередь под и для меня :)

Alex
18.03.2021, 10:24
Я полагаю, что новый дизасемблер будет интересен. Пусть не сильно многим. Но люди интересующиеся найдутся. Тем боле версия его будет более продвинутой с учётом недостатков существующих.

Hunta
18.03.2021, 10:35
Поживём - увидим, но написал я его в первую очередь для себя, так как те, которые я видел - меня в той или иной степени не устраивали.
Включая IDA.
Которую тоже надо допиливать, а вот это делать (учитывая, КАК это там делается) у меня нет желания.

Hunta
28.03.2021, 10:30
Отвлёкся немного от ДизАсм-а на ВАКСу - ну да, как долго с чём то вожусь - аки в печёнках. Но про него не забывал :)
Отказался (по крайне мере пока) от автоматического определения ячеек-векторов (куча программ, особенно тестовых, у которых там хрен знает что), реализовал вместо этого ручную подсказку. Сделал адекватным отрисовку последствий команд Вектор и Сброс (формата ячейки). Поскольку теперь идёт отслеживание ссылок, так же добавил автоматическую перерисовку ссылающихся ячеек при смене формата ссылочной ячейки. Ну и пофиксил некоторое количество ошибок. С ужасом продолжаю смотреть на команду ASCIZ :) Но потихоньку буду допиливать и её :)

Hunta
02.04.2021, 21:37
Война с ASCII и ASCIZ. Ну и до кучи - с .EVEN :) Вроде что то (ТТТ) получается :)

Hunta
03.04.2021, 12:36
Добавил поддержку битовой карты в .SAV файлах. Результат (DESS был загружен в DisAsm и сразу без моих действий сгенерирован .MAC, который оттранслирован и собран)
До поддержки



.@DESS

.MACRO/LIST:DESS DESS

.LINK/STACK:1000 DESS

.DIFF/BIN DESS.SAV DESS.SRC

BINCOM comparing/ DK:DESS.SAV -- DK:DESS.SRC
000000 362/ 000300 000200 000100
?BINCOM-W-Files are different

.


После добавления поддержки



.@DESS

.MACRO/LIST:DESS DESS

.LINK/STACK:1000 DESS

.DIFF/BIN DESS.SAV DESS.SRC
?BINCOM-I-No differences found

.

Hunta
05.04.2021, 19:23
STALK оказалась полезной в плане доработки DisAsm-11.

Во-первых, добавил поддержку КОИ-8 в генерацию ASCII - технически - вообще минут на 5 работы, но под рукой не было файла, в котором был русский КОИ-8 - и вот - попался :)

Во-вторых, добавил автоматическую резку длинных .ASCII строк. Мне как бы вообще фиолетово, какой там длины .ASCII получился, но вот MACRO-11 на больше 132 символов в строке воротит нос - не комильфо, видите ли ему :)

В-третьих, найдены и пофиксины очередные ошибки :)

Ну и повозившись с получающимся .MAC понял - надо доводить результат работы до состояния, когда можно без правки результата дизасм нулевого блока (там, где служебка) пихать результат на вход MACRO и LINK (в том числе, без указания опции /STACK:1000, когда начальное значение стека совпадает с умолчанием) и получать идентичный исходному результат :)

Вариант с автоматической резкой длинных строк лежит там же - http://www.kpxx.ru/Soft/Utils/Stalk

Hunta
05.04.2021, 23:45
.=^O<400>

.ASCII |Внимание !!! Программа выводит текстовые сообщения в коде КОИ-8, поэтому вы должны иметь драйвер, |
.ASCIZ |обслуживающий терминал в КОИ-8. (например, мой TS.SYS для УКНЦ). Олег Ховайко, (UB5AJV). |


.=^O<722>

.ASCIZ <ESC>|H|<ESC>|J*BASED ON '|<RUS>|PIKNIK NA OBO^INE|<LAT>|'* |

.PSECT
M01000:


MACRO/LIST:STALK STALK
LINK/STACK STALK

Всё. От .ASECT (если только программа не хранит что то в нулевом блоке) избавился. Так же как и от /STACK:1000, если используется стандартный стек :)

- - - Добавлено - - -

DESS тоже проходит тест на идентичность - генерация исходника сразу после загрузки в DisAsm - без вмешательства и /STACK:1000

- - - Добавлено - - -

Stalk тест Моментальная идентичность - пока не проходит - немного неправильно генерируется код - аргумент команды воспринимается как команда и происходит своеобразное наложение (днём посмотрю - в чем причина). Но если эту ошибку поправить - тест проходит

Hunta
06.04.2021, 13:05
С Digger налетел на проблему, которая не даёт сделать .SAV, идентичный исходному. Суть проблема - хвост файла (там одни нули) был срезан, но служебная информация, в частности - битовая карта - не тронута. То есть я могу сделать так, что бы новый .SAV был идентичного размера и почти идентичного (кроме битовый карты) содержимого или я могу сделать так, что бы всё содержимое было идентичным, но новый .SAV будет большего размера - с нулями в "лишнем" хвосте. Остановился на втором варианте - так как в его случае этот "нулевой" хвост можно срезать, не трогая оставшуюся часть

Итого - три программы, проходящие (с учётом вышесказанного) тест Моментальная Идентичность :)

- - - Добавлено - - -

Гы :) Это я и срезал :) Проанализировав содержимое :) Но не вспомнив про битовую карту :) Ну значит теперь я и это могу поправить :)

- - - Добавлено - - -

Ну вот, после правки битовой карты и топ-адреса исходного .SAV на правильные значение - Digger так же проходит тест Моментальная идентичность :)

Hunta
07.04.2021, 00:21
Благодаря двум новым подопытным кроликам

- исправил неточность генерации двух- и трёх- словных команды, когда на второе или третье слово есть внешняя ссылка
- расширил правила генерации .MAC из .SAV
- понял (но ещё не реализовал), что надо добавлять в программу работу из командной строки. Что то типа DisAsm /SAV DAY.SAV /GEN. Это позволить сделать автоматическое тестирование - даже на пяти .SAV уже тяжеловато всё делать руками :)

Подопытные кролики - DAY.SAV, DESS.SAV, DIG.SAV, HAND.SAV и STALK.SAV - все проходят тест Моментальная идентичность :)

Alex
07.04.2021, 13:26
Ещё можно проверить на файлах-загрузках в КЦГД и в периферийный процессор УКНЦ. Там могут оказаться ещё какие-нибудь проблемы.

Hunta
07.04.2021, 13:35
Ещё можно проверить на файлах-загрузках в КЦГД и в периферийный процессор УКНЦ. Там могут оказаться ещё какие-нибудь проблемы.
Ну, формально это не .SAV, так что... :) Есть у меня под это более свободный формат - образ памяти.

Alex
07.04.2021, 14:04
Ну это если образ памяти грузится отдельной программой...
Я, очень давно, пытался дизассемблировать загрузки в КЦГД. Там большая часть программ(что были у меня) была одним файлом. Была прикольная программа, которая запускала в КЦГД часы и более ничего. Автор мне неведом... KCTIME(дай бог памяти). Небольшая. Брала время из системы и запускала в КЦГД мелкую программку, которая в углу экрана показывала время. Для меня интерес представлял механизм работы со штатным ПЗУ. И естественно автор программы не смог удержаться от защиты от дизассемблирования :) Он просто сдвинул тело программы-загрузки на один байт. До меня долго доходило что там не так... В конце-концов написал утилитку вытаскивающую программу-загрузку из исходного файла и уж её дизассемблировал. А формально файл вполне .SAV
Наверное вдохновился "независимым" временем на "фрязинском" дисплее(КСМ) :)

Ещё сталкивался с тем, что адреса в этим загрузках в КЦГД накладывались на адреса загружающей программы. В результате получался винегрет по меткам :)
Было у меня подозрение, что для этих программ писали программы загружатель и непосредственно загрузку по отдельности. Потом или утилитой, либо утилитой и ручками собирали в один файл.

Hunta
07.04.2021, 14:09
Безусловно, пока такой вариант защищённой программы не будет дизассемблирован :) Но вот с ходу я даже не скажу - а можно ли сделать такой вариант защиты штатными средствами - то есть есть исходник, мы его MAC-им, LINK-им и на выходе получаем идентичный .SAV. То есть собрать ДВА .SAV-а, а потом их смержить - без вопросов - этот метод реализуем. А вот так, что бы с одним .SAV-ом и сразу после LINK идентичный...

Hunta
07.04.2021, 21:01
Уф... Автоматическое тестирование - обязательно :)

Начал переделку под работу и из командной строки - начал смотреть, как очередные изменения влияют на дизасм других типов файлов. И тест процессора KDJ11-B преподнёс ошибку - DisAsm сваливался по переполнению стека. Сначала подумал, кто это декодирование инструкций (был у меня там рекурсивный вызов - заодно его хакнул), а оказывается - автоматическая перерисовка при изменении формата ячеек. Я с ней давно ковыряюсь, но вот последнее время уделял внимание только .SAV формату, а последствия изменения программы на других форматах (а точнее - файлах) и не проверял. Оказывается - зря :)

Глубоко не копал, но сваливалось оно в ситуации когда ячейки прямо или косвенно ссылаются друг на дружку :) Код поправил, но там полуэвристическое правило - надо будет ещё поглядеть на результат. По сути, это важно только при рассматривании кода в программе, если генерируется .MAC файл - то для кода генерации картинка по ячейкам - статическая, так что никакого влияния автоматическая перерисовка не окажет. Но хочется, что бы на экране всё сразу как надо отрисовывалось :)

Hunta
08.04.2021, 11:33
Добавлен нужный (мне :) ) функционал
Встали на ячейку - видим все адреса, которые на неё ссылаются. Выбираем, щёлкаем JumpTo... (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-022.jpg)
... и она выбрана в (основном) окне дизасма (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-023.jpg)

- - - Добавлено - - -

Вдогонку :) Если показывается всего один адрес в этих двух списках (верхний - ссылка на чётный байт, нижний - на нечётный) - то можно и не выбирать :) Кнопки абсолютно идентичны, сделано три, что бы мышку меньше двигать. Возможно, повешу и шорт-кат :)

Hunta
08.04.2021, 21:56
K:\PDP\Soft.Not Recoded\0.WorkDir2>test.cmd

K:\PDP\Soft.Not Recoded\0.WorkDir2>dir stalk.*
Volume in drive K is Temp A
Volume Serial Number is D289-BED8

Directory of K:\PDP\Soft.Not Recoded\0.WorkDir2

06.04.2021 00:00 512 STALK.COM
04.04.2021 00:00 25 088 STALK.SRC
2 File(s) 25 600 bytes
0 Dir(s) 425 474 093 056 bytes free

K:\PDP\Soft.Not Recoded\0.WorkDir2>DisAsm11.exe /SAV "K:\PDP\Soft.Not Recoded\0.WorkDir2\STALK.SRC" /Generate

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe MACRO/LIST:STALK STALK


K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe LINK STALK


K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe DIFF/BIN STALK.SAV STALK.SRC

?BINCOM-I-No differences found

K:\PDP\Soft.Not Recoded\0.WorkDir2>dir stalk.*
Volume in drive K is Temp A
Volume Serial Number is D289-BED8

Directory of K:\PDP\Soft.Not Recoded\0.WorkDir2

06.04.2021 00:00 512 STALK.COM
08.04.2021 22:53 472 209 STALK.LST
08.04.2021 22:53 151 380 STALK.MAC
08.04.2021 22:53 26 624 STALK.OBJ
08.04.2021 22:53 25 088 STALK.SAV
04.04.2021 00:00 25 088 STALK.SRC
6 File(s) 700 901 bytes
0 Dir(s) 425 473 409 024 bytes free

K:\PDP\Soft.Not Recoded\0.WorkDir2>

Alex
09.04.2021, 10:29
Безусловно, пока такой вариант защищённой программы не будет дизассемблирован :) Но вот с ходу я даже не скажу - а можно ли сделать такой вариант защиты штатными средствами - то есть есть исходник, мы его MAC-им, LINK-им и на выходе получаем идентичный .SAV. То есть собрать ДВА .SAV-а, а потом их смержить - без вопросов - этот метод реализуем. А вот так, что бы с одним .SAV-ом и сразу после LINK идентичный...

Можно ;) Если дизассемблер покажет их тупо как данные(последовательность слов или байтов, строк :) )И всё соберёт обратно ;) Только дизассемблирована будет только программа загрузчик...

Hunta
09.04.2021, 10:33
Если дизассемблер покажет их тупо как данные
Строго говоря, это не будет правильный результат дизасм-а программы. Будет результат дизасма загрузчика-дешифратора :) И такой результат будет совсем не интересен ;)

По этому поводу есть у меня мысли, но это точно будет не сейчас пробоваться к реализации - есть более приоритетные задумки и надо поиграться подольше с программой :)

Hunta
10.04.2021, 15:01
DisAsm11.exe /cha ZKDJV2.BIC /g
DisAsm11.exe /image dos_rk.bin /generate /base 0 /start 0
DisAsm11.exe /image "DEC-11-L2PC-PO Absolute Loader.ptap" /base 0 /start 6 /generate "DEC-11-L2PC-PO Absolute Loader.mac"


Ну и так далее :)

Hunta
10.04.2021, 23:57
Некоторые шероховатости есть, но в целом - работает :) (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-026.jpg)

- - - Добавлено - - -

Как теперь происходит тестирование :)



K:\PDP\Soft.Not Recoded\0.WorkDir2>test.cmd

K:\PDP\Soft.Not Recoded\0.WorkDir2>DisAsm11.exe /SAV DAY.SRC /Generate

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe $@DAY

.MAC/LIST:DAY DAY

.LINK DAY

.DIFF/BIN DAY.SAV DAY.SRC
?BINCOM-I-No differences found

K:\PDP\Soft.Not Recoded\0.WorkDir2>DisAsm11.exe /SAV DESS.SRC /Generate

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe $@DESS

.MACRO/LIST:DESS DESS

.LINK DESS

.DIFF/BIN DESS.SAV DESS.SRC
?BINCOM-I-No differences found

K:\PDP\Soft.Not Recoded\0.WorkDir2>DisAsm11.exe /SAV DIG1.SRC /Generate

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe $@DIG1

.MAC/LIST:DIG1 DIG1

.LINK DIG1

.DIFF/BIN DIG1.SAV DIG1.SRC
?BINCOM-I-No differences found

K:\PDP\Soft.Not Recoded\0.WorkDir2>DisAsm11.exe /SAV HAND.SRC /Generate

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe $@HAND

.MAC/LIST:HAND HAND

.LINK HAND

.DIFF/BIN HAND.SAV HAND.SRC
?BINCOM-I-No differences found

K:\PDP\Soft.Not Recoded\0.WorkDir2>DisAsm11.exe /SAV STALK.SRC /Generate

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe $@STALK

.MACRO/LIST:STALK STALK

.LINK STALK

.DIFF/BIN STALK.SAV STALK.SRC
?BINCOM-I-No differences found


- - - Добавлено - - -

До возможного первого публичного тестирования осталась одна фича - переименование меток :)

- - - Добавлено - - -

Отшлифовал шерховатости :)

Hunta
11.04.2021, 01:59
Программа отправилась в первое бета-тестирование :)

Но как обычно - на подсунутом файле (я его тоже гоняю, потому что) нашлись ошибки генерации кода, хотя и не катастрофичные.

Плохо, что файл .LDA и его я пока не могу после компиляции-сборки сделать что то типа исходного - то есть пока на идентичность не проверишь :(

Hunta
11.04.2021, 08:41
Проблема с областью векторов - всякие загрузчики имеют в этой области всякие код и данные, обычные программы тоже напрямую с этой областью не сильно работают (особенно в RSX - там программа в этой области может что угодно держать), при поверхностном анализе я пока не придумал, как определять - используется ли ячейка как вектор или как просто ячейка, поэтому была реализована подсказка - пометить ячейку как вектор.

Из прикольного, выяснившегося на первом бета-тестировании - действие - пометить ячейку как вектор, я сделал, на шот-кат повесил, а вот кнопки... не нарисовал :) Так что пока это - тайное знание - кнопка V с клавиатуры делает эту подсказку :)

Hunta
11.04.2021, 10:55
Пофиксил пару ошибок, слегка причесал работу с векторами, в автоматическое тестирование добавлены новые файлы - форматы - образ памяти и LDA

Hunta
11.04.2021, 14:02
Некоторые файлы пока проверяются на - возникли ошибки при трансляции-сборке или нет.
Но вот есть одна ошибка, вывод которой я не знаю, как отключить...




K:\PDP\Soft.Not Recoded\0.WorkDir2>DisAsm11.exe /IMAGE ABSLDR.SRC /Base 0 /Start 6 /Gen ABSLDR.MAC

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe $@ABSLDR

.MAC/LIST:ABSLDR ABSLDR

.LINK/LDA ABSLDR

K:\PDP\Soft.Not Recoded\0.WorkDir2>DisAsm11.exe /SAV DAY.SRC /Generate DAY.MAC

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe $@DAY

.MAC/LIST:DAY DAY

.LINK DAY

.DIFF/BIN DAY.SAV DAY.SRC
?BINCOM-I-No differences found

K:\PDP\Soft.Not Recoded\0.WorkDir2>DisAsm11.exe /SAV DESS.SRC /Generate

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe $@DESS

.MACRO/LIST:DESS DESS

.LINK DESS

.DIFF/BIN DESS.SAV DESS.SRC
?BINCOM-I-No differences found

K:\PDP\Soft.Not Recoded\0.WorkDir2>DisAsm11.exe /SAV DIG1.SRC /Generate

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe $@DIG1

.MAC/LIST:DIG1 DIG1

.LINK DIG1

.DIFF/BIN DIG1.SAV DIG1.SRC
?BINCOM-I-No differences found

K:\PDP\Soft.Not Recoded\0.WorkDir2>DisAsm11.exe /IMAGE DOSRK.SRC /Base 0 /Start 0 /Gen DOSRK.MAC

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe $@DOSRK

.MAC/LIST:DOSRK DOSRK

.LINK/LDA DOSRK

K:\PDP\Soft.Not Recoded\0.WorkDir2>DisAsm11.exe /SAV HAND.SRC /Generate

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe $@HAND

.MAC/LIST:HAND HAND

.LINK HAND

.DIFF/BIN HAND.SAV HAND.SRC
?BINCOM-I-No differences found

K:\PDP\Soft.Not Recoded\0.WorkDir2>DisAsm11.exe /LDA JKDBD0.SRC /Start 0 /Gen JKDBD0.MAC

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe $@JKDBD0

.MAC/LIST:JKDBD0 JKDBD0

.LINK/LDA JKDBD0

K:\PDP\Soft.Not Recoded\0.WorkDir2>DisAsm11.exe /Session JKDBD0.BIC.session /gen JKDBD1.MAC

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe $@JKDBD1

.MAC/LIST:JKDBD1 JKDBD1
?MACRO-E-Errors detected: 59
DK:JKDBD1,DK:JKDBD1=DK:JKDBD1

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe MACRO JKDBD1

Z 3976 016164 000120 JMP (R0)+
Z 4129 016616 004120 JSR R1, (R0)+
Z 6210 026126 060020 ADD R0, (R0)+
Z 6236 026206 060040 ADD R0, -(R0)
Z 6266 026300 060030 ADD R0, @(R0)+
Z 6312 026430 060050 ADD R0, @-(R0)
Z 6368 026576 010760 000004 MOV PC, 4(R0)
Z 6388 026644 010770 000004 MOV PC, @4(R0)
Z 6407 026706 010777 177166 MOV PC, @K26100
Z 6425 026746 010767 177126 MOV PC, K26100
Z 9572 042610 010767 135356 MOV PC, V.170+2
Z 9610 042716 010767 135250 MOV PC, V.170+2
Z 9628 042756 010767 135210 MOV PC, V.170+2
Z 9666 043064 010767 135102 MOV PC, V.170+2
Z 9684 043124 010767 135042 MOV PC, V.170+2
Z 9722 043232 010767 134734 MOV PC, V.170+2
Z 9740 043272 010767 134674 MOV PC, V.170+2
Z 9778 043400 010767 134566 MOV PC, V.170+2
Z 9795 043436 010767 134530 MOV PC, V.170+2
Z 9835 043550 010767 134416 MOV PC, V.170+2
Z 9852 043606 010767 134360 MOV PC, V.170+2
Z 9892 043720 010767 134246 MOV PC, V.170+2
Z 10041 044414 010767 133552 MOV PC, V.170+2
Z 10068 044476 010767 133470 MOV PC, V.170+2
Z 10095 044560 010767 133406 MOV PC, V.170+2
Z 10122 044642 010767 133324 MOV PC, V.170+2
Z 10148 044722 010767 133244 MOV PC, V.170+2
Z 10174 045002 010767 133164 MOV PC, V.170+2
Z 10200 045062 010767 133104 MOV PC, V.170+2
Z 10227 045144 010767 133022 MOV PC, V.170+2
Z 10254 045226 010767 132740 MOV PC, V.170+2
Z 10280 045306 010767 132660 MOV PC, V.170+2
Z 10306 045366 010767 132600 MOV PC, V.170+2
Z 10393 045634 010767 132332 MOV PC, V.170+2
Z 10463 046034 010767 132132 MOV PC, V.170+2
Z 10719 047040 010767 131126 MOV PC, V.170+2
Z 10752 047136 010767 131030 MOV PC, V.170+2
Z 10785 047234 010767 130732 MOV PC, V.170+2
Z 10820 047336 010767 130630 MOV PC, V.170+2
Z 10853 047434 010767 130532 MOV PC, V.170+2
Z 10886 047532 010767 130434 MOV PC, V.170+2
Z 10921 047634 010767 130332 MOV PC, V.170+2
Z 10954 047732 010767 130234 MOV PC, V.170+2
Z 11000 050060 010767 130106 MOV PC, V.170+2
Z 11037 050164 010767 130002 MOV PC, V.170+2
Z 11074 050270 010767 127676 MOV PC, V.170+2
Z 11105 050362 000120 JMP (R0)+
Z 11111 050374 010767 127572 MOV PC, V.170+2
Z 11126 050434 000121 JMP (R1)+
Z 11133 050450 000122 JMP (R2)+
Z 11141 050464 000123 JMP (R3)+
Z 11147 050476 010767 127470 MOV PC, V.170+2
Z 11162 050536 000124 JMP (R4)+
Z 11169 050552 000125 JMP (R5)+
Z 11177 050566 000126 JMP (SP)+
Z 11183 050600 010767 127366 MOV PC, V.170+2
Z 11199 050640 000127 022700 JMP #22700
Z 11219 050702 010767 127264 MOV PC, V.170+2
Z 11256 051006 010767 127160 MOV PC, V.170+2
?MACRO-E-Errors detected: 59
DK:JKDBD1=DK:JKDBD1

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe LINK/LDA JKDBD1


K:\PDP\Soft.Not Recoded\0.WorkDir2>DisAsm11.exe /IMAGE MONITR.SRC /Base 0 /Start 0 /Gen MONITR.MAC

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe $@MONITR

.MAC/LIST:MONITR MONITR

.LINK/LDA MONITR

K:\PDP\Soft.Not Recoded\0.WorkDir2>DisAsm11.exe /SAV STALK.SRC /Generate

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe $@STALK

.MACRO/LIST:STALK STALK

.LINK STALK

.DIFF/BIN STALK.SAV STALK.SRC
?BINCOM-I-No differences found

K:\PDP\Soft.Not Recoded\0.WorkDir2>DisAsm11.exe /LDA SYSLD1.SRC /Gen SYSLD1.MAC

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe $@SYSLD1.COM

.MAC/LIST:SYSLD1 SYSLD1

.LINK/LDA SYSLD1

K:\PDP\Soft.Not Recoded\0.WorkDir2>DisAsm11.exe /LDA SYSLD2.SRC /Gen SYSLD2.MAC

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe $@SYSLD2.COM

.MAC/LIST:SYSLD2 SYSLD2

.LINK/LDA SYSLD2

K:\PDP\Soft.Not Recoded\0.WorkDir2>DisAsm11.exe /LDA SYSLD3.SRC /Gen SYSLD3.MAC

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe $@SYSLD3.COM

.MAC/LIST:SYSLD3 SYSLD3

.LINK/LDA SYSLD3

K:\PDP\Soft.Not Recoded\0.WorkDir2>DisAsm11.exe /LDA SYSLD4.SRC /Gen SYSLD4.MAC

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe $@SYSLD4.COM

.MAC/LIST:SYSLD4 SYSLD4

.LINK/LDA SYSLD4

K:\PDP\Soft.Not Recoded\0.WorkDir2>DisAsm11.exe /ChainedLDA ZKDJV2.SRC /Gen ZKDJV2.MAC /Start 200

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe $@ZKDJV2

.MAC/LIST:ZKDJV2 ZKDJV2
?MACRO-E-Errors detected: 13
DK:ZKDJV2,DK:ZKDJV2=DK:ZKDJV2

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe MACRO ZKDJV2

Z 350 001156 000123 JMP (R3)+
Z 384 001262 020040 CMP R0, -(R0)
Z 1373 004540 000120 JMP (R0)+
Z 1385 004562 000121 JMP (R1)+
Z 1393 004576 000122 JMP (R2)+
Z 1417 004652 000123 JMP (R3)+
Z 1425 004666 000124 JMP (R4)+
Z 1433 004704 000125 JMP (R5)+
Z 1452 004742 000126 JMP (SP)+
Z 1464 004766 000127 001127 JMP #1127
Z 2919 011626 000121 JMP (R1)+
Z 3148 012470 000127 000401 JMP #401
Z 3433 013532 004427 000240 JSR R4, #240
?MACRO-E-Errors detected: 13
DK:ZKDJV2=DK:ZKDJV2

K:\PDP\Soft.Not Recoded\0.WorkDir2>K:\PDP\Emul\RTP\RT11.exe LINK/LDA ZKDJV2

Hunta
11.04.2021, 20:18
Помимо исправление некоторого количества ошибок и неточностей в отслеживании ссылок...

Я решил, что запоминание местоположений во всех трёх окнах при сохранении сеанса - полезная фича (ибо вспоминать ещё и - где я там прервался - даже через полчаса - не комильфо) и...

Добавил это :) Теперь прога запоминает текущий адрес в каждом окне при сохранении сеанса и восстанавливает его при загрузке сеанса :)

Hunta
09.01.2022, 03:31
В процессе дизасма прошивки для Зелакс-Секунды пофиксино некоторое количество ошибок, опять была попытка сделать правильный "парсинг" строк (не сильно удачно), а потом добавлен дизасм команд FPP (долго ленился сделать это). Сделал на основе описания дизасма команд FPP в FullODT :) До этого было наоборот - на основании описания в DisAsm-е делал описание для FullODT :)

Woxem
09.01.2022, 13:38
А можно ссылку на программу

Hunta
09.01.2022, 13:49
А можно ссылку на программу
Сейчас идёт тестирование, как только - пришлю.

Woxem
16.06.2022, 13:53
А все таки можно промежуточный вариант

Hunta
16.06.2022, 14:30
Можно. Только я до правок генерации .ASCII так и не добрался, что бы собрать обратно - нужны будут ручные правки после генерации исходника.

Вечером выложу текущую версию и пришлю ссылку

Hunta
13.08.2022, 14:13
На работе (в рабочее время имеется ввиду) нарисовался перерыв и вспомнилась мне задумка - сделать более удобной работой с комментариями. Почесав почесуемое, решил - пуркуа бы и не па? Сколько времени затратил - не скажу - и не вёл учёт времени (всё таки не работа) и с перерывами делалось и больше вылизывал удобство работы, а не сам функционал, но.. не много. Так что теперь комменатрии вводятся почти как в текстовом редакторы - жмём ; на выбранной команде (или данных), вводим комментарий, нажимаем Enter, вводим комментарий для следующей команды (или данных) и так, пока не надоест или комментарии не закончатся, а тогда жмём Esc и возвращаемся в окно листинга. Вводит можно в любом из трёх окон.

А потом голову посетила мысль, что теперь извлекать .TSK файлы из образов RSX сталко плёвым делом - и решил я добавить поддержку и таких файлов :) Вообщем, начал пилить. Собственно, для допила требуется только распотрощить служебку - и всё.

Но пока, как и для .SAV файлов - никаких оверлеев и никаких I-D задач. Это на будущее.

Ещё в TSK поддерживаются резидентные библиотеки (некоторый аналог .DLL в Windows) - посмотрю, возможно это дело включу в данном релизе.

И, поскольку такой вопрос периодически возникает, продублирую ответ здесь, в первом сообщении, а потом и в теме про ImgUtil (и всех всех всех с ней связанных)

Пока большая часть моих программ - RequestWare, то есть, если что-то из написанного мной кому-то интересно, а у меня на недо-сайте не выложено - пишем в теме или в личку - обсуждаемо.

Hunta
13.08.2022, 18:55
Начало положено :) (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-027.jpg)

Hunta
18.08.2022, 15:24
Развлечения с .TSK продолжаются. Формат "несколько" сложней других форматх и не всё с ходу понятно по документации, но картинка постепенно вырисовывается. Но до теста Моментальная идентичность ещё далеко. Да и что бы его реализовать - нужна генерация не только .MAC файла, но и командника для сборщика TKB...

Hunta
20.08.2022, 02:55
Одна из "проблем", нарисовавшихся первоначально при написании ImgUtil, а затем и DisAsm-11 - в силу сложной структуры .TSK - необходимость переноса определений всяких констант, смещений и т.п., которые были сделаны через макросы в макробиблиотеках, выглядевшие примерно так:


.MACRO LBLDF$ L,B
.ASECT
.=0
R$LNAM:'L'.BLKW 2
R$LSA:'L' .BLKW 1
R$LHGV:'L'.BLKW 1
R$LMXV:'L'.BLKW 1
R$LLDZ:'L'.BLKW 1
R$LMXZ:'L'.BLKW 1
R$LOFF:'L'.BLKW 1
R$LWND:'L'.BLKW 1
R$LSEG:'L'.BLKW 1
R$LFLG:'L'.BLKW 1
R$LDAT:'L'.BLKW 3
R$LSIZ:'L'.BLKW 0
LD$ACC='B'100000
LD$RSV='B'040000
LD$CLS='B'020000
LD$SMV='B'010000
LD$SCL='B'000200
LD$AMK='B'000060
LD$RES='B'000040
LD$SUP='B'000010
LD$REL='B'000004
LD$TYP='B'000002
....

Первоначально всё это дело переносилось руками 1) в описание констант-смещений, а затем 2) создавались описания классов для удобства программирования, после чего это выглядело примерно так:


[Flags]
public enum LD_FLG: UInt16
{
LD_TYP = 2 // 2 Shared region type (1 - common, 1 - library)
, LD_REL = 4 // 4 Position-independent code (PIC) flag (1 - PIC)
, LD_SUP = 8 // 10 Supervisor mode library (1 - yes)
, LD_RES = 32 // 40 Library has memory-resident overlays
, LD_CLS = 8192 // 20000 Library is part of a cluster
, LD_RSV = 16384 // 40000 APR was reserved
, LD_ACC = 32768 // 100000 Access intention (1 - rw, 0 - ro)
}

...

public static class RLBDF
{
public static readonly UInt16 R_LNAM = 0; // 4 Library/common name
public static readonly UInt16 R_LSA = (ushort)(R_LNAM + 4); // 2 Base address of library
public static readonly UInt16 R_LHGV = (ushort)(R_LSA + 2); // 2 Highest address in first library window
public static readonly UInt16 R_LMXV = (ushort)(R_LHGV + 2); // 2 Highest address in library
public static readonly UInt16 R_LLDZ = (ushort)(R_LMXV + 2); // 2 Library load size (64 byte blocks)
public static readonly UInt16 R_LMXZ = (ushort)(R_LLDZ + 2); // 2 Library max size (64 byte blocks)
public static readonly UInt16 R_LOFF = (ushort)(R_LMXZ + 2); // 2 Library offset into region
public static readonly UInt16 R_LWND = (ushort)(R_LOFF + 2); // 2 Number of library window blocks
public static readonly UInt16 R_LSEG = (ushort)(R_LWND + 2); // 2 Size of library segment desciptors
public static readonly UInt16 R_LFLG = (ushort)(R_LSEG + 2); // 2 Library flag word
public static readonly UInt16 R_LDAT = (ushort)(R_LFLG + 2); // 2+2+2 Library creation date - year, month, day
public static readonly UInt16 R_LSIZ = (ushort)(R_LDAT + 6); // length
}

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

Мне как то не нравилась сама эта идея (да и написание скрипта - тоже не быстро и не сразу под всякие варианты), потому как она не решала две другие проблемы - короткие имена членов класса и преобразование "сырых" данных, прочитанных из файла (по сути - массив байт) в экземпляры класса.

Да, имена членов класса можно после написания программы можно переименовать (и VS поможет найти и поправить старые имена по всему проекту), но после этого терялась связь с первоначальными именами - если только не переносить их - руками - во что-нибудь типа комментариев.

Плюс - под каждый класс надо было писать конструктор, типа такого:


public SharedRegion(byte[] data)
{
Name = data.GetDWord(RLBDF.R_LNAM).Radix50().Trim();
BaseAddress = data.GetWord(RLBDF.R_LSA);
HighetFirstWinAddress = data.GetWord(RLBDF.R_LHGV);
HighestVirtualAddress = data.GetWord(RLBDF.R_LMXV);
LoadSizeIn64bBlocks = data.GetWord(RLBDF.R_LLDZ);
MaximumSizeIn64bBlocks = data.GetWord(RLBDF.R_LMXZ);
OffsetIntoPartition = data.GetWord(RLBDF.R_LOFF);
WindowBlocksCount = data.GetWord(RLBDF.R_LWND);
SizeOfSegmentDescriptors = data.GetWord(RLBDF.R_LSEG);
Flags = (LD_FLG)data.GetWord(RLBDF.R_LFLG);
CreationDate = new RSXDate(data.GetTWord(RLBDF.R_LDAT));
}

который принимает на вход массив байт и парсит его по полям класса. Ещё одна совершенно "ручная" и нудная задача.

И вот сегодня, почесав почесуемое, решил я использовать возможности .NET (однажды такое уже было, но несколько в другой области). А именно - аттрибуты и рефлексию :) Примерно через три часа программирования - остался только один класс, который выглядит примерно так:



public class SharedRegion
{
[Map("R$LNAM: .BLKW 2", PDP11Type.Radix50)] public string Name; // Shared region name
[Map("R$LSA: .BLKW 1")] public UInt16 BaseAddress; // Base virtual address
[Map("R$LHGV: .BLKW 1")] public UInt16 HighetFirstWinAddress; // Highest address in first library window
[Map("R$LMXV: .BLKW 1")] public UInt16 HighestVirtualAddress; // Highest address in library
[Map("R$LLDZ: .BLKW 1")] public UInt16 LoadSizeIn64bBlocks; // Library load size (64 byte blocks)
[Map("R$LMXZ: .BLKW 1")] public UInt16 MaximumSizeIn64bBlocks; // Library max size (64 byte blocks)
[Map("R$LOFF: .BLKW 1")] public UInt16 OffsetIntoPartition; // Library offset into region
[Map("R$LWND: .BLKW 1")] public UInt16 WindowBlocksCount; // Number of library window blocks
[Map("R$LSEG: .BLKW 1")] public UInt16 SizeOfSegmentDescriptors; // Size of library overlay segment descriptor
[Map("R$LFLG: .BLKW 1")] public LD_FLG Flags; // Library flag word
public bool IsLibrary => ((Flags & LD_FLG.LD_TYP) != 0); // 2 Shared region type (1 - common, 1 - library)
public bool IsPositionIndependentCode => ((Flags & LD_FLG.LD_REL) != 0); // 4 Position-independent code (PIC) flag (1 - PIC)
public bool IsSupervisorModeLibrary => ((Flags & LD_FLG.LD_SUP) != 0); // 10 Supervisor mode library (1 - yes)
public bool HasMemoryResidentOverlays => ((Flags & LD_FLG.LD_RES) != 0); // 40 Library has memory-resident overlays
public bool IsClusterPart => ((Flags & LD_FLG.LD_CLS) != 0); // 20000 Library is part of a cluster
public bool IsAPRReserved => ((Flags & LD_FLG.LD_RSV) != 0); // 40000 APR was reserved
public bool IsRWAccessIntention => ((Flags & LD_FLG.LD_ACC) != 0); // 100000 Access intention (1 - rw, 0 - ro)

[Map("R$LDAT: .BLKW 3")] public RSXDate CreationDate; // Library creation date

[Map("R$LSIZ:")] public static UInt16 Length; // Block length

а его конструктора - так:



public SharedRegion(byte[] data)
{
this.Mapper(data);
}

И вот этот метод Mapper - он общий для любого класса, описание которое построено таким же образом. И большую часть такого описания класса можно сделать с помощью макросов в FAR-е на основе исходного макроса. Останется только добавить название полей в класс для C# и нарисовать простейшие конструкторы. Всё. Длина поля, как можно видеть, берётся из макроса, а смещение в блоке байт высчитывается на основении описаний в методе Mapper. Плюс этот метод может осуществлять и некоторые преобразование - скажем, поле Name ("R$LNAM") хранится как два слова в формате Radix50 - но в объект класса C# будет перенесено как строка.

Пока это больше концептуальная идея (есть ещё нюансы, над которыми надо подумать - скажем, пока не нравится, как выглядят и как используются описания флагов), но технически её УЖЕ можно задействовать. Одну описанную пару классов я переделал, надо переделать вторую, а вот описание третьего блока данных уже будет делаться сразу по такой схеме - а значит - конструктор можно будет уже не писать :)

Ну и как в очередной раз буду развлекаться в ImgUtil - тоже начну переделывать по такой схеме :)

BlaireCas
20.08.2022, 12:37
А что кстати под RT-11 нет дизасма? Внезапно казалось что должен быть какой-т.
Но вообще полезное дело да, вдруг кому пригодится :)

(правда даже имея исходник понять чет сложно, даже с комментариями, сам глянул в свой код на асме и голова гругом пошла мол "че тут такое" :) .. но лучше чтоб был дизасм чем чтобы его не было, иначе утеряна способность в 8-ричных кодах читать программу)

Hunta
20.08.2022, 12:53
А что кстати под RT-11 нет дизасма
Ну как бы сейчас уже какой-никакой есть, но.

Были и раньше. Но - или совсем тупые (то есть тупо в лоб и практически без возможности повлиять на генерацию кода) или мне не нравились (типа IDA - хотя про него говорили, что его можно допилить модулями на Phyton-е, но меня и этот вариант не устроил).

В целом же меня интересовал более универсальный вариант. Уже сейчас - образ памяти, .LDA, .SAV и какой-никакой, но вариант для .TSK), плюс возможность подсказки, плюс комментарии. Пока во всех вариантах - программы без оверлеев и образы без страничной организации (ну тут я начинаю приближаться к доделке). Плюс - можно прерваться, сохранить уже натворённое и потом вернутся. Плюс - генерация полноценного .MAC (в том числе через командную строку) - то есть его можно подсунуть ассемблеру, потом компоновщику и (пока без особоых теледвижения для .SAV) сравнить с исходником.

Ну и какое никакое развитие - правда, в основном в режиме - понадобилось что-то ещё дизассемблировать - оппа - чего-то не хватает - а не дописать ли :) Вот как сейчас.


правда даже имея исходник понять чет сложно, даже с комментариями, сам глянул в свой код на асме и голова гругом пошла
Как показала моя практика года так два, что ли, назад - для меня и процесс разборки логики дизассмеблированного и процесс понимания потом, по прошествию времени - резко ускорился после перехода на использования макросов для структурного программирования. Которые, кстати, ускорили и написание кода - примерно так на порядок :)

- - - Добавлено - - -

Ну а насколько удобен или нет DisAsm-11 кому то, кроме меня (мне то понятно - под меня писался) - можно поинтересоваться у anasana-ы - он его использовал для восстановления исходников тестов :)

Hunta
21.08.2022, 00:52
Структура метки (первый блок) .TSK файла немного отличается между вариантом под M и под M-Plus (из за поддержки разделяемых библиотек режима супервизора). И из-за этого различия некоторые поля имеют разные смещения в зависимости от содержимого поля L$BSYS (4 для M-Plus). А сама структура метки - фиксированная по длине часть; переменная по длине часть; фиксированная по длине часть. И после некоторого размышления - получилось сделать описание и под такой вариант (своеобразный if else в аттрибутах):


public class TaskLabel
{
[Map("L$BTSK: .BLKW 2", PDP11Type.Radix50)] public string TaskName;
[Map("L$BPAR: .BLKW 2", PDP11Type.Radix50)] public string TaskPartitionName;
[Map("L$BSA: .BLKW 1")] public UInt16 BaseAddress;
[Map("L$BHGV: .BLKW 1")] public UInt16 HighestWin0VirtualAddress;
[Map("L$BMXV: .BLKW 1")] public UInt16 HighestVirtualAddress;
[Map("L$BLDZ: .BLKW 1")] public UInt16 LoadSizeIn64bBlocks;
[Map("L$BMXZ: .BLKW 1")] public UInt16 MaximumSizeIn64bBlocks;
[Map("L$BOFF: .BLKW 1")] public UInt16 OffsetIntoPartition;
[Map("L$BWND: .BLKB 1")] public byte WindowBlocksCount;
[Map("L$BSYS: .BLKB 1")] public byte SysID;
[Map("L$BSEG: .BLKW 1")] public UInt16 SizeOfOverlaySegmentDescriptors;
[Map("L$BFLG: .BLKW 1")] public TS_FLG Flags;
public bool IsNoExternalHeader => ((Flags & TS_FLG.TS_NXH) != 0);
public bool IsExternalHeader => ((Flags & TS_FLG.TS_XHR) != 0);
public bool IsPriviledge => ((Flags & TS_FLG.TS_PRV) != 0);
public bool IsDoesNotMapIOPage => ((Flags & TS_FLG.TS_IOP) != 0);
public bool IsCheckpointable => ((Flags & TS_FLG.TS_CHK) != 0);
public bool IsInCompatabilityMode => ((Flags & TS_FLG.TS_CMP) != 0);
public bool IsNoSend => ((Flags & TS_FLG.TS_NSD) != 0);
public bool IsSlaveTask => ((Flags & TS_FLG.TS_SLV) != 0);
public bool IsGeneratesPostmortDump => ((Flags & TS_FLG.TS_PMD) != 0);
public bool IsAncillaryControlProcessor => ((Flags & TS_FLG.TS_ACP) != 0);
public bool IsNoHeader => ((Flags & TS_FLG.TS_NHD) != 0);
public bool IsPositionIndependentCode => ((Flags & TS_FLG.TS_PIC) != 0);
[Map("L$BDAT: .BLKW 3")] public RSXDate CreationDate;
[Map("L$BLIB: .BLKW ?L$BSYS:=4:15:7")] public SharedRegion[] SharedRegions;
[Map("L$SOME: .BLKW 1")] public UInt16 Some;
[Map("L$BPRI: .BLKW 1")] public UInt16 Priority;
[Map("L$BXFR: .BLKW 1")] public UInt16 TransferAddress;
[Map("L$BEXT: .BLKW 1")] public UInt16 TaskExtension;
[Map("L$BSGL: .BLKW 1")] public UInt16 SegmentLoadListBlockNumber;
[Map("L$BHRB: .BLKW 1")] public UInt16 HeaderBlockNumber;
[Map("L$BBLK: .BLKW 1")] public UInt16 LabelBlockCount;
[Map("L$BLUN: .BLKW 1")] public UInt16 LUNCount;
[Map("L$BROB: .BLKW 1")] public UInt16 ROImageRelativeBlockNumber;
[Map("L$BROL: .BLKW 1")] public UInt16 ROImageLoadSize;
[Map("L$BRDL: .BLKW 1")] public UInt16 RODataSizeIn64bBlocks;
[Map("L$BHDB: .BLKW 1")] public UInt16 DataHeaderRelativeBlockNumber;
[Map("L$BDHV: .BLKW 1")] public UInt16 DataWin1HighVirtualAddress;
[Map("L$BDMV: .BLKW 1")] public UInt16 DataHighVirtualAddress;
[Map("L$BDLZ: .BLKW 1")] public UInt16 DataLoadSize;
[Map("L$BDMZ: .BLKW 1")] public UInt16 DataMaxSize;
[Map("L$BAPR: .BLKW 1")] public UInt16 BAPR; // ??
[Set(".=772")]
[Map("L$BFL2: .BLKW 1")] public static TS_FLG2 Flags2;
[Map("L$BLRL: .BLKW 1")] public UInt16 BLRL; // ??
[Map("L$AME: .BLKW 1")] public UInt16 AME; // ??
[Set(".=1000")]
[Map("L$BASG:")] public static UInt16 Length;
...

Конструктор этого класса в старом варианте:


public TaskLabel(byte[] data, uint baseOffset = 0)
{

TaskName = data.GetDWord(LBLDF.L_BTSK).Radix50().Trim();
TaskPartitionName = data.GetDWord(LBLDF.L_BPAR).Radix50().Trim();
BaseAddress = data.GetWord(LBLDF.L_BSA);
HighestWin0VirtualAddress = data.GetWord(LBLDF.L_BHGV);
HighestVirtualAddress = data.GetWord(LBLDF.L_BMXV);
LoadSizeIn64bBlocks = data.GetWord(LBLDF.L_BLDZ);
MaximumSizeIn64bBlocks = data.GetWord(LBLDF.L_BMXZ);
OffsetIntoPartition = data.GetWord(LBLDF.L_BOFF);
WindowBlocksCount = data[LBLDF.L_BWND];
SysID = data[LBLDF.L_BSYS];
SizeOfOverlaySegmentDescriptors = data.GetWord(LBLDF.L_BSEG);
Flags = (TS_FLG)data.GetWord(LBLDF.L_BFLG);
CreationDate = new RSXDate(data.GetTWord(LBLDF.L_BDAT));

UInt16 currPtr = LBLDF.L_BLIB;
int maxCnt = SysID == 4? 15 : 7;
int commonCnt = 0;
while ((maxCnt > 0) && (data.GetWord(currPtr) != 0))
{
maxCnt--;
commonCnt++;
currPtr += (UInt16)typeof(SharedRegion).GetOffset("R$LSIZ");
}
if ((maxCnt == 0) && (data.GetWord(currPtr) != 0)) throw new FormatException("Error in task label");
commonCnt = WindowBlocksCount;
SharedRegions = new SharedRegion[commonCnt];

UInt16 R_LSIZ = (UInt16)typeof(SharedRegion).GetOffset("R$LSIZ");

for (int idx=0; idx<commonCnt; idx++)
{
SharedRegions[idx] = new(data, (uint)(LBLDF.L_BLIB + idx * R_LSIZ));
}

if (SysID == 4)
{
Priority = data.GetWord(LBLDF.L_BPRI_MP);
TransferAddress = data.GetWord(LBLDF.L_BXFR_MP);
TaskExtension = data.GetWord(LBLDF.L_BEXT_MP);
SegmentLoadListBlockNumber = data.GetWord(LBLDF.L_BSGL_MP);
HeaderBlockNumber = data.GetWord(LBLDF.L_BHRB_MP);
LabelBlockCount = data.GetWord(LBLDF.L_BBLK_MP);
LUNCount = data.GetWord(LBLDF.L_BLUN_MP);
ROImageRelativeBlockNumber = data.GetWord(LBLDF.L_BROB_MP);
ROImageLoadSize = data.GetWord(LBLDF.L_BROL_MP);
RODataSizeIn64bBlocks = data.GetWord(LBLDF.L_BRDL_MP);
DataHeaderRelativeBlockNumber = data.GetWord(LBLDF.L_BHDB_MP);
DataWin1HighVirtualAddress = data.GetWord(LBLDF.L_BDHV_MP);
DataHighVirtualAddress = data.GetWord(LBLDF.L_BDMV_MP);
DataLoadSize = data.GetWord(LBLDF.L_BDLZ_MP);
DataMaxSize = data.GetWord(LBLDF.L_BDMZ_MP);
BAPR = data.GetWord(LBLDF.L_BAPR_MP); // ??
}
else
{
Priority = data.GetWord(LBLDF.L_BPRI);
TransferAddress = data.GetWord(LBLDF.L_BXFR);
TaskExtension = data.GetWord(LBLDF.L_BEXT);
SegmentLoadListBlockNumber = data.GetWord(LBLDF.L_BSGL);
HeaderBlockNumber = data.GetWord(LBLDF.L_BHRB);
LabelBlockCount = data.GetWord(LBLDF.L_BBLK);
LUNCount = data.GetWord(LBLDF.L_BLUN);
ROImageRelativeBlockNumber = data.GetWord(LBLDF.L_BROB);
ROImageLoadSize = data.GetWord(LBLDF.L_BROL);
RODataSizeIn64bBlocks = data.GetWord(LBLDF.L_BRDL);
DataHeaderRelativeBlockNumber = data.GetWord(LBLDF.L_BHDB);
DataWin1HighVirtualAddress = data.GetWord(LBLDF.L_BDHV);
DataHighVirtualAddress = data.GetWord(LBLDF.L_BDMV);
DataLoadSize = data.GetWord(LBLDF.L_BDLZ);
DataMaxSize = data.GetWord(LBLDF.L_BDMZ);
BAPR = data.GetWord(LBLDF.L_BAPR); // ??
}
}

и в новом:


public TaskLabel(byte[] data)
{
this.Mapper<TaskLabel>(data);
}

Безусловно, Mapper был дописан для поддержки нового описания в Map :) И доделка предполагает и несколько более сложные варианты - несколько вариантов длины блока переменной длины. И блок может быть не один. В целом же - доделка пока идёт по принципу - налетим на что то ещё в макросах - подпилим Mapper :)

Осталось подумать над работой с флагами :)

Hunta
21.08.2022, 23:31
Новое описание с самого начала сделано по такой схеме.


[Macro("HDRDF$")] public class TaskHeader
{
[Map("H.CSP: .BLKW 1")] public UInt16 CurrentStackPointer; // Current stack pointer
[Map("H.HDLN: .BLKW 1")] public UInt16 HeaderLength; // Header length
[Map("H.EFLM: .BLKW 1")] public UInt16 EventFlagMask; // Event flag mask
[Set(".=.-2")]
[Map("H.SMAP: .BLKB 1")] public byte SupervisorModeMappingMask; // Supervisor mode mapping mask
[Map("H.DMAP: .BLKB 1")] public byte IDSpaceModeMappingMask; // I- and D-space mode mapping mask
[Map("H.EFLA: .BLKW 1")] public UInt16 EventFlagAddress; // Event flag address
[Set(".=.-2")]
[Map("H.FMAP: .BLKW 1")] public UInt16 H_FMAP; // ??
[Map("H.CUIC: .BLKW 1")] public UInt16 CurrentUIC; // Current UIC
[Map("H.DUIC: .BLKW 1")] public UInt16 DefaultUIC; // Default UIC
[Map("H.IPS: .BLKW 1")] public UInt16 InitialPS; // Initial PS
[Map("H.IPC: .BLKW 1")] public UInt16 InitialPC; // Initial PC
[Map("H.ISP: .BLKW 1")] public UInt16 InitialSP; // Initial SP
[Map("H.ODVA: .BLKW 1")] public UInt16 ODTSSTVectorAddress; // ODT SST vector address
[Map("H.ODVL: .BLKW 1")] public UInt16 ODTSSTVectorLength; // ODT SST vector length
[Map("H.TKVA: .BLKW 1")] public UInt16 TaskSSTVectorAddress; // Task SST vector address
[Map("H.TKVL: .BLKW 1")] public UInt16 TaskSSTVectorLength; // Task SST vector length
[Map("H.PFVA: .BLKW 1")] public UInt16 PowerFailASTControlBlock; // Power fail AST control block
[Map("H.FPVA: .BLKW 1")] public UInt16 FloatingPointASTControlBlock; // Floating-point AST control block
[Map("H.RCVA: .BLKW 1")] public UInt16 ReceiveASTControlBlock; // Receive AST control block
[Map("H.EFSV: .BLKW 1")] public UInt16 EventFlagContextAddress; // Address of event flag context
[Map("H.FPSA: .BLKW 1")] public UInt16 FloatingPointContextAddress; // Address of floating-point context
[Map("H.WND: .BLKW 1")] public UInt16 PointerToNumberOfWindowBlock; // Pointer to number of window block
[Map("H.DSW: .BLKW 1")] public UInt16 DirectiveStatusWord; // Directive status word
[Map("H.FCS: .BLKW 1")] public UInt16 FCSImpureStorageAddress; // Address of FCS impure storage
[Map("H.FORT: .BLKW 1")] public UInt16 FORTRANImpureStorageAddress; // Address of FORTRAN impure storage
[Map("H.OVLY: .BLKW 1")] public UInt16 OverlayImpureStorageAddress; // Address of overlay impure storage
[Map("H.VEXT: .BLKW 1")] public UInt16 ImpureVectorsAddress; // Address of impure vectors
[Map("H.SPRI: .BLKB 1")] public byte SwappingPriority; // Swapping priority
[Map("H.NML: .BLKB 1")] public byte MailboxLUN; // Mailbox LUN
[Map("H.RRVA: .BLKW 1")] public UInt16 ReceiveByReferenceASTControlBlock; // Receive by reference AST control block
[Map("H.X25: .BLKB 1")] public byte X25; // H_X25
[Map("H.RES1: .BLKB 1")] public byte H_Reserved1; // Reserved
[Map("H.RES2: .BLKW 1")] public UInt16 H_Reserved2; // Reserved
[Map("H.LUTE: .BLKW 1")] public UInt16 H_LUTE; // Reserved
[Map("H.GARD: .BLKW 1")] public UInt16 HeaderGuardWord; // Header guard word
[Map("H.NLUN: .BLKW 1")] public UInt16 NumberOfLUNs; // Number of luns
[Map("H.LUN: .BLKW ?H.NLUN")] public LUNDescriptor[] LUNTable; // LUN table (2 words per LUN)

static TaskHeader()
=> Helpers.Mapper<TaskLabel>();

public TaskHeader(byte[] data, uint baseOffset = 0)
=> this.Mapper<TaskHeader>(data, baseOffset);
}

Слегка расширен функционал Mapper-а

Hunta
22.08.2022, 10:24
Законченный TaskHeader


[Macro("HDRDF$")] public class TaskHeader
{
[Map("H.CSP: .BLKW 1")] public UInt16 CurrentStackPointer; // Current stack pointer
[Map("H.HDLN: .BLKW 1")] public UInt16 HeaderLength; // Header length
[Map("H.EFLM: .BLKW 1")] public UInt16 EventFlagMask; // Event flag mask
[Set(".=.-2")]
[Map("H.SMAP: .BLKB 1")] public byte SupervisorModeMappingMask; // Supervisor mode mapping mask
[Map("H.DMAP: .BLKB 1")] public byte IDSpaceModeMappingMask; // I- and D-space mode mapping mask
[Map("H.EFLA: .BLKW 1")] public UInt16 EventFlagAddress; // Event flag address
[Set(".=.-2")]
[Map("H.FMAP: .BLKW 1")] public UInt16 H_FMAP; // ??
[Map("H.CUIC: .BLKW 1")] public UInt16 CurrentUIC; // Current UIC
[Map("H.DUIC: .BLKW 1")] public UInt16 DefaultUIC; // Default UIC
[Map("H.IPS: .BLKW 1")] public UInt16 InitialPS; // Initial PS
[Map("H.IPC: .BLKW 1")] public UInt16 InitialPC; // Initial PC
[Map("H.ISP: .BLKW 1")] public UInt16 InitialSP; // Initial SP
[Map("H.ODVA: .BLKW 1")] public UInt16 ODTSSTVectorAddress; // ODT SST vector address
[Map("H.ODVL: .BLKW 1")] public UInt16 ODTSSTVectorLength; // ODT SST vector length
[Map("H.TKVA: .BLKW 1")] public UInt16 TaskSSTVectorAddress; // Task SST vector address
[Map("H.TKVL: .BLKW 1")] public UInt16 TaskSSTVectorLength; // Task SST vector length
[Map("H.PFVA: .BLKW 1")] public UInt16 PowerFailASTControlBlock; // Power fail AST control block
[Map("H.FPVA: .BLKW 1")] public UInt16 FloatingPointASTControlBlock; // Floating-point AST control block
[Map("H.RCVA: .BLKW 1")] public UInt16 ReceiveASTControlBlock; // Receive AST control block
[Map("H.EFSV: .BLKW 1")] public UInt16 EventFlagContextAddress; // Address of event flag context
[Map("H.FPSA: .BLKW 1")] public UInt16 FloatingPointContextAddress; // Address of floating-point context
[Map("H.WND: .BLKW 1")] public UInt16 PointerToNumberOfWindowBlock; // Pointer to number of window block
[Map("H.DSW: .BLKW 1")] public UInt16 DirectiveStatusWord; // Directive status word
[Map("H.FCS: .BLKW 1")] public UInt16 FCSImpureStorageAddress; // Address of FCS impure storage
[Map("H.FORT: .BLKW 1")] public UInt16 FORTRANImpureStorageAddress; // Address of FORTRAN impure storage
[Map("H.OVLY: .BLKW 1")] public UInt16 OverlayImpureStorageAddress; // Address of overlay impure storage
[Map("H.VEXT: .BLKW 1")] public UInt16 ImpureVectorsAddress; // Address of impure vectors
[Map("H.SPRI: .BLKB 1")] public byte SwappingPriority; // Swapping priority
[Map("H.NML: .BLKB 1")] public byte MailboxLUN; // Mailbox LUN
[Map("H.RRVA: .BLKW 1")] public UInt16 ReceiveByReferenceASTControlBlock; // Receive by reference AST control block
[Map("H.X25: .BLKB 1")] public byte X25; // H_X25
[Map("H.RES1: .BLKB 1")] public byte H_Reserved1; // Reserved
[Map("H.RES2: .BLKW 1")] public UInt16 H_Reserved2; // Reserved
[Map("H.LUTE: .BLKW 1")] public UInt16 H_LUTE; // Reserved
[Map("H.GARD: .BLKW 1")] public UInt16 HeaderGuardWordPointer; // Header guard word pointer
[Map("H.NLUN: .BLKW 1")] public UInt16 NumberOfLUNs; // Number of luns
[Map("H.LUN: .BLKW ?H.NLUN")] public LUNDescriptor[] LUNTable; // LUN table (2 words per LUN)
// Check RSX names!
[Map("H.NWIN: .BLKW 1")] public UInt16 NumberOfWindows; // Number of Window blocks
[Map("H.WIN: .BLKW ?H.NWIN")] public WindowBlock[] WindowBlocks; // Window Blocks
[Map("H.CPS: .BLKW 1")] public UInt16 CurrentPS; // Current PS
[Map("H.CPC: .BLKW 1")] public UInt16 CurrentPC; // Current PC
[Map("H.CR5: .BLKW 1")] public UInt16 CurrentR5; // Current R5 Initial value - Relative block number of header
[Map("H.CR4: .BLKW 1")] public UInt16 CurrentR4; // Current R4 Initial value - Ident word #2
[Map("H.CR3: .BLKW 1")] public UInt16 CurrentR3; // Current R3 Initial value - Ident word #1
[Set(".=.-4")]
[Map("H.IDENT:.BLKW 2", PDP11Type.InvertRadix50)] public string Ident; // Ident
[Map("H.CR2: .BLKW 1")] public UInt16 CurrentR2; // Current R2 Initial value - Task name word #2 (if include debugger)
[Map("H.CR1: .BLKW 1")] public UInt16 CurrentR1; // Current R1 Initial value - Task name word #1 (if include debugger)
[Set(".=.-4")]
[Map("H.IDENT:.BLKW 2", PDP11Type.InvertRadix50)] public string TaskName; // Task name
[Map("H.CR0: .BLKW 1")] public UInt16 CurrentR0; // Current R0 Initial value - Program transfer address (if include debugger)
[Map("H.GRD: .BLKW 1")] public UInt16 HeaderGuardWord; // Header guard word

//public static readonly UInt16 H_FPSL=25.*2;

static TaskHeader()
=> Helpers.Mapper<TaskHeader>();

public TaskHeader(byte[] data, uint baseOffset = 0)
=> this.Mapper(data, baseOffset);
}


- - - Добавлено - - -

В основном возня с аттрибутами закончена, осталось описать ещё один класс на инфу из служебной части .TSK (на данном этапе ни на что не влияет), теперь буду разбираться с отображением на резидентные библиотеки и с инфой о перекрытиях - пока понимания, особенно о первом - не сильно много :)

Hunta
24.08.2022, 12:59
.TSK с перекрытиями. Первый подход к снаряду (http://www.KpXX.Ru/Soft/Utils/DisAsm11/disasm11-028.jpg)
Ну, если говорить строго, до перекрытий в данном случая я ещё не добрался (но программа с перекрытиями), только начал раскручивать информацию о них (правое верхнее окно, там же пример автогенерации комментариев), но началась отработка показа листингов для таких программ. Пока на так называемой multi-user task.

Этот вариант поддерживается (ЕМНИП) только в M-Plus и основная мысль в их реализации - как можно сэкономить память. Секции с атрибутами RO и RW собираются в отдельные сегменты и сегмент RO как бы образует встроенную в .TSK dll библиотеку (в терминах RSX - Shared Library). Когда такая программа запускается в первый раз, операционка создаёт область памяти, в которую загружает RO сегмент, далее традиционным способом организуется задача (в Windows аналог - процесс) и часть её адресного пространства отображается на RO область (с защитой от записи). При втором и последующих запусках - область уже создана, так что нужно только создать задачу и отобразить на RO область - что позволяет ускорить запуск и сэкономить память. При этом, если завершены все экземпляры задач программы - RO область может остаться висет в памяти - если количество свободной памяти достаточно для запуска других программ (ускорение запуска нашей muliuser программы). Эта область может быть удалена из памяти - если памяти не хватает, а запущенных экземпляров multiuser программы нет, или "выгружена" - если они есть. Если планировщик выбирает multiuser задачу для выполнения, а любая её часть/части (включая RO область) выгружены - предварительно выгруженные части подгружаются. В данном случае "выгрузка" для RO части - на самом деле фикция - поскольку копия RO - при "выгрузке" она просто удаляется из памяти, а "загружена" она будет из файла программы.

Пример содержимого памяти с запущенной multiuser задачей:


RSX-11M-PLUS V4.6 BL87 (KPXX01) 256K UP 000:00:00 2022-08-24 11:05:02
TASK= *IDLE* FREE= SY0:165840. P0:DMO
VF1:1071. P1:DMO PARS
POOL=4592.:4746.:15. SECPOOL=368.:512.:71%
4592.:4746.:15. 368.:512.:71% SECPOL:P
SYSPAR:D
IN: D M TR T PD MV DP . F F F DRVPAR:D
10 I C KC T UU UF WM . C 1 1 GEN :D
63K R R TT : C: :: :T . S 1 1
OUT: 1 . N. O . A R A A
0 1 . . M . T E C C
0K M . . . . S P P
!========!===>]=]===)!)()=))>-----+---! <>---+
0*******16******32******48******64******80******96 ******112*****
E----P----P-------D---------------D----------D------------------
----------------------------------------------------------------
128*****144*****160*****176*****192*****208*****22 4*****240*****
-->--+ !--->-->--->-><---->--->
P . A Q S H L B R ERRSEQ
I . C M Y R P A M 0.
P . D G S C 0 P D
T P 2 . L . 0 T
0 I 0 . O . 0
P . G .

...AT., ...PIP - RO сегменты
PIPT0 - RW сегмент
Обработчки командых файлов ICP (задача ...AT.) в текущий момент не запущен - в памяти только RO сегмент, а ...PIP был запущен, так что виден RO сегмент (...PIP) и RW сегмент запущенной задачи (PIPT0)

- - - Добавлено - - -

Найдена (и поправлена) ошибка (на скриншоте DisAsm-а видна неправильно сформировавшаяся строка) и поправлен функционал "разрезания" строк. Поскольку была приличная переделка работы с памятью "загруженной" программы - большой этап тестирования, прежде чем двинусь с концепта дальше.

- - - Добавлено - - -

Подкорректированный вариант (http://www.KpXX.Ru/Soft/Utils/DisAsm11/disasm11-029.jpg)

Hunta
25.08.2022, 16:39
Давно задуманный и наконец реализованный функционал (http://www.KpXX.Ru/Soft/Utils/DisAsm11/disasm11-030.jpg)
Пока метка занёса руками :) Думаю, добавить в генерацию кода - благо в процедурах работы с перекрытиями достаточно стандартные метки :) Ну и задумки по работе со всяким из стандартных библиотек :)

P.S. Слегка накосячил с картинкой, поправил, через некоторое время будет видна правильная (и эту строку уберу)

Hunta
26.08.2022, 11:05
Пофиксил некоторое количество ошибок.

Теперь, после появления возможности добавлять свои имена меток - анализатор может вставлять метки.
Чем и воспользовался :) (http://www.KpXX.Ru/Soft/Utils/DisAsm11/disasm11-031.jpg)
Все метки расставлены автоматически.

- - - Добавлено - - -

Случайно открыл. С чего всё начиналось. (http://www.KpXX.Ru/Soft/Utils/DisAsm11/disasm11-001.jpg) Поржал :)

Hunta
26.08.2022, 22:07
Начал раскручивать описание перекрытий (http://www.KpXX.Ru/Soft/Utils/DisAsm11/disasm11-032.jpg)
Пока самый простой вариант - автозагрузка с диска. На картинке - фрагмент описания.
А ещё могут быть перекрытия, резидентные в памяти, а ещё может быть программа, использующая сегменты кода и даных... А плюс ещё мультизадачные программы.. с поддержкой кода-данных.. А ещё прилинкованные библиотеки.. или разделяемые блоки данных... А ещё разделяемые библиотеки режиму супервизора... А ещё разные версии процедур поддержки перекрытий...

Но пока более прозаичный вопрос - в каком формате это будет в DisAsm-е, что бы удобно было отображать картинки и что бы было удобно работать со всем этим барахлом...

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

И да, всё это раскручено и прокомментированно самим DisAsm-ом, то есть я просто открыл программу в нём и переместился на интересные места.

Hunta
28.08.2022, 17:55
Идея пришла в голову - идея была реализована (http://www.KpXX.Ru/Soft/Utils/DisAsm11/disasm11-033.jpg)
Сначала сделал немного по-другому, но там начали вылазить проблема за проблемой и в какой-то момент сказал - нахфик и сделал по другому. В целом, первый вариант мне был как-то больше по душе и может быть я его реализую - когда-нибудь, когда придумаю - как. А пока вот так :)
Комментарий был слямзен с исходника, что опять как бы намекает на использования шаблонов - из исходников стандартных (в первую очередь из SYSLIB) процедур :)

- - - Добавлено - - -

Вдогонку - выхода на пользовательский интерфейс пока нет, но в варианте, который был реализован - работы минут на 10-15, надо будет только придумать - как будет выглядеть интерфейс :)

BlaireCas
31.08.2022, 09:11
Интересно стало как сдизассемблирует такой код? Навроде скажем реинициализация счетчика (ну а что, может ведь такое быть):

RSTTIM: mov (pc)+, (pc)+
TINIT: .word 100
TCURR: .word 0
return
Тут возможно сложновато ибо надо анализировать используются-ли эти адреса где-нибудь еще и если используются - делать нотацию через (PC)+ для понимания.

Hunta
31.08.2022, 09:23
Интересно стало как сдизассемблирует такой код?
Вот сходу не скажу (и лень смотреть по коду), щас подсуну и посмотрим :)

- - - Добавлено - - -

Первый вариант кода (http://www.KpXX.Ru/Soft/Utils/DisAsm11/disasm11-034.jpg)
Второй вариант кода (http://www.KpXX.Ru/Soft/Utils/DisAsm11/disasm11-035.jpg)
Кстати, если бы всё таки подумал - то нарисовал бы - что получится :)

BlaireCas
31.08.2022, 09:32
щас подсуну и посмотрим
Ну в принципе нормально что метки ставит рядом и понять можно будет в итоге. А то опасался что меток рядом не поставит. В принципе не прямо часто наверное пользуются похожей конструкцией (хотя лично я кое-где для экономии места юзаю)

Hunta
31.08.2022, 09:41
Ну в принципе нормально что метки ставит рядом и понять можно будет в итоге. А то опасался что меток рядом не поставит
Там зависит от того - будут ли ссылки на эти две ячейки откуда-то ещё (отслеживание идёт) - есть - метки поставит. И метки он ставит именно на ячейке, но когда не может (так как в ячейке второй или третий аргумент команды, например) - делает вот так. Хотя может быть и .-1 и .-2

Почему я не стал делать с (PC)+) - лишний код проверки и неперевариемость MACRO-11 конструкции вида MOV (PC)+, #100 (а также MOV (PC)+, 100 и MOV (PC)+, @100) - а значит ещё лишний код проверок

Вместо MOV - и другие двух-адресные команды

Точнее - переварить то он переварит, но код сгенерит неверный :)

Hunta
31.08.2022, 20:51
ибо надо анализировать используются-ли эти адреса где-нибудь еще
Что-то как-то не обратил внимание на это предложение :) Комментарий к нему.
Это было сделано с очень ранних версий DisAsm-а. К сожалению, из-за переноса кода под более свежую версию VS - коммиты остались, но дата-время самых первых - устрачены :) Но если посмотреть комменты здесь, то работа была начата примерно в районе 28.02.2021, а отслеживание ссылок началось 04.03.2021, то есть на пятый день возни с программой :) Всё это дело несколько поплыло после того, как начали появляться команды-подсказки и вроде только сегодня я добил последнюю(?) неправильность (скажем, ячейка с командой ссылалась на ячейку с данными, соотвественно - на ячейке с данными был метка, а потом ячейка с командой была помечена как НЕИЗВЕСТНОЕ - но метка оставалась, теперь, если это была последняя ссылка - метка убирается), но - даже до сегодня - лишние метки могли быть, пропущенных - вроде нет :)

Ещё одна особенность DisAsm-а - он НЕ ГЕНЕРИРУЕТ исходник у себя где то в памяти. Загруженная программа - это массив ячеек со значениями и аттрибутами. И в зависимости от значения и аттрибутов - ячейка будет визуализирована (в окне или при генерации исходника) так или иначе. Причем, если какой-нибудь аттрибут поменяется - ячейка (при показе в окне) будет сразу перерисована. А кнопка - сгнерировать исходник - это записать некую префиксную часть (зависит от типа файла), а потом просто пробежаться по ячейкам и то, как они будут отрисованы в данный момент - записать в файл. Ну и этих аттрибутов достаточно много :) Например - список ссылок на данную ячейку :)


Поправил немного ошибок, вынес возможность задавать описания на (стандартные) метки через файл, ещё позанимался с блочными комментариями - теперь они доступны через пользовательский интерфейс. Например. (http://www.KpXX.Ru/Soft/Utils/DisAsm11/disasm11-036.jpg) И например. (http://www.KpXX.Ru/Soft/Utils/DisAsm11/disasm11-037.jpg)
Комменатрий - тоже аттрибут - и если он меняется - моментальная визуализация (посимвольных) изменений :)

- - - Добавлено - - -

А, да, DisAsm различает автоматически сгенерированные метки и поставленные руками.
Поставленные руками - не убираются при отслеживании ссылок :)
То есть пользователь поставил метку - она будет железной и будет использована вместо автоматически сгенерированной. Убрал ручную метку - и или не будет или появится автоматически сгенерированная :)

Hunta
01.09.2022, 21:28
Начал экспериментировать с шаблонами. Пока больше в плане именно экспериментов. Так как какой-то готовой идеи пока в голове нет - надо наплодить разных вариантов - и посмотреть - на что налечу. Пока отталкиваюсь от листинга MACRO-11, но - предварительно почищенный - для отработки парсинга в принципе.

Хотя.. Есть у меня уже некий вариант парсера - который из листинга делает MIF файл :) Надо будет и его привлечь - он там зело универсальный в плане подачи на вход листинга. Почти любой съест :)

BlaireCas
02.09.2022, 19:21
1. А этот дизасм осилит ведь проц 1801ВМ1? Да да я знаю что щас кто-то скажет "небось демки с БК-0010 решил подизасмить да глянуть".
2. Можно ему подсунуть бинарник (тупо дамп с какого-то адреса и мол указать собственно этот адрес)?
3. А где релиз? Где скачивать? (я понимаю небось в личку надо лезть за этим или ждать релиза видимо)

Hunta
02.09.2022, 19:43
А этот дизасм осилит ведь проц 1801ВМ1?
Пока возможности выбрать конкретную модель проца, что бы дизассемблились только его (и в том числе его уникальные) команды - нет. Периодически всплывает мысль, но пока в дальних планах. Очень дальних :) Но может вдруг приспичить - и тогда неожиданно (в первую очередь для меня) - нарисую :) Так было с метками :) Знал, что надо, но... а потом раз - и за полчаса основа накидал, потом поигрался и мелочи допилил. Постепенно :) Последнюю - сегодня :)


Можно ему подсунуть бинарник (тупо дамп с какого-то адреса и мол указать собственно этот адрес)?
Да, если это просто тупо дамп памяти и он не больше 64к и не использует всякие хитрые маппинги - они тоже в мыслях, но пока даже идеи нет, как это сделать - почему я взялся за оверлии - смысл похожий. Откатаю оверлеи - тогда посмотрим.
Выбирается образ памяти, задается начальный адрес, стартовый адрес (его можно и после), выбирается файл - и вперёд


А где релиз?
В первом сообщении добавил инфу - как можно получить :) Недели три как добавил ;)

Как такогового релиза (по крайне мере пока) нет. Да и врят ли будет - программа пишется в первую очередь под меня (хотя если что-то из предложенного заинтересует - могу и реализовать - когда-нибудь в свободное время. Ну и пишется, когда появляется какая-то потребность, мысль или желание пофиксить ошибки :)

Могу дать текущий вариант, если только он на текущий момент - работающий, если нет тогда могу дать предыдущий вариант, если он ещё остался. Или вариант, который выложил в закрытую часть моего файлообменника. Ну и оповещать, если не забуду, при выходе следующего. Хотя можно и тут посматривать и напоминать :)

На текущий момент вроде работает, именно сейчас воюю с комментариями - если строка получается длинней, чем 131 символ, то MACRO-11 ругается - но на генерацию исходника по идеи это не влияет - а длинные комменты можно и руками поправить.

Ну и плюс известно, что иногда хреново генерятся строковые константы (которые в .ASCII/.ASCIZ) и при этом могут поплыть метки рядом с ними (совсем рядом). С этим тоже пориодически воюю - с переменным успехом.

Вот как-то так :)

BlaireCas
02.09.2022, 19:56
Могу дать текущий вариант, если только он на текущий момент - работающий, если нет тогда могу дать предыдущий вариант
Ну тут автору (тебе) виднее. Можно ведь банально на гитхаб закинуть с релизами. Не думаю что там люди набегут "сразу позорить мол че это за бред, так никто не пишет на с++, интерфейс *****" и т.д.
Думается тут темой систем команд PDP-11 интересуется три живых человека (аминь Хоботу :( ) Никита вон с эмулятором УКНЦ (кстати подлый Manwe на "демотивейшн" яндекса обозвал УКНЦ мол "ущербный компьютер наверное цветной", вот гад! это я шутя конечно, он хорошиы человек, просто БК во все поля), затем вот ты тут с более продвинутой техникой мол макро-ассемблер все такое. Ну и .. так а кто-ж третий. Нам нужен третий! Titus был или Alex_K вот они тоже монстры но более железячные чтоли.

Мне нравится что ты не забиваешь, пишешь чего-то. Возможно применение даже найдет если в открытый доступ выложить да хоть с исходниками.

Hunta
02.09.2022, 20:17
Можно ведь банально на гитхаб закинуть с релизами.
Внутрениий (локальный) гит. А на github смысла не вижу - это до какой-то степени исследовательский проект - то есть я могу что-то нарисовать, отправить в гит, потом переделать, отправить в гит, а потом опять вернуться к старому варианту. Какого-то плана написания кода нет - поэтому - разброд и шатания - весьма часты


сразу позорить мол че это за бред, так никто не пишет на с++
Вот как раз это глубоко фиолетово. Хотя бы потому, что написано на C# - его я хоть как-то перевариваю из С-подобных языков, ну а C++ просто не люблю :)


Мне нравится что ты не забиваешь, пишешь чего-то
Первая любовь (я про PDP-11), а теперь хобби. Так что развлекаться я на эту тему буду ещё дооооолго :)


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

Вон драйвера под разные варианты CF карт для RT-11 более менее доведены до ума и вылизаны - они лежат в открыть доступе (с исходниками). Хотя как раз с исходниками будут проблемы - из-за используемых макросов :)

BlaireCas
02.09.2022, 20:25
Первая любовь (я про PDP-11), а теперь хобби
Да уж, практически то-ж самое. Как потом плевался от x86 ассемблера. Ой ладно, не буду ностальгировать. Хороший софт, пусть будет. Но на гитхаб все-ж выложи :)

Hunta
02.09.2022, 20:44
Как потом плевался от x86 ассемблера
Я его так толком и не освоил :) Хотя для 8080 (ака 580ВМ) - писал - под Микрошу (первый домашний комп)


Но на гитхаб все-ж выложи
Может быть, как нибудь

Hunta
04.09.2022, 00:24
Добавлена проверка вводимых меток (длина, набор символов). Пока без локальных (там мысли надо обдумать).
Доработана работа с комментариями - программа учитывает максимальную длину строки в MACRO-11, вставляя переход на новую строку при превышении длины (ищется подходящее место), при этом различаются вставленные пользователем переходы (железные, как с метками) и автоматические - эти при необходимости удаляются - что то типа параграфов и автовыравнивания по ширине.

Ну и как обычо - исправление обнаруженных ошибок и рефакторинг :)

Hunta
06.09.2022, 17:28
Пока не удалось чего либо нового сделать, но, как обычно, захотелось чего то странного, и, ради интереса, перенес проект из старого .NET в новый .NET 6 (старое название семейства - .NET Core). Как это ни странно - всё взлетело на раз. Создал WPF проект, грохнул пару файлов, скопировал исходники из старого проекта, скопировал пару файлов-описателей (там, где метки будущий шаблонизатор) и вуаля - всё заработало :) Думал, будет какое-то количество правок, но - н и ч е г о :)

Hunta
23.09.2022, 12:38
До DisAsm-а руки пока не дошли, но поигрался (на старых проектах) с .NET 6. Оч понравилось - в первую очередь то, что (пока) старые проекты перенеслись без проблем и MS наконец добила проблему длинных путей (больше примерно 255 символов) - я как не воевал с ней в старой .NET - так (приемлемо для меня) и не решил. А тут всё без проблем - и даже автоматом исчезла проблема в FTPSync (синхронизация локальной копии с ftp сервером) на одном файле с очень длинным именем (похоже - тоже из разряда слишком длинного пути).

А так же наткнулся (да да, они существуют с VS 2015 :) ) на shared project - которые несколько лучше решают проблему модулей, которые используются в нескольких проектах, но делать их в виде dll не хочется.

В целом же - некоторые мои проекты в принципе уйдут на .NET 6 (и старый вариант не будет развиваться), а для некоторых (типа DisAsm-а) попробую подддерживать (за счёт shared project) оба варианта - вроде как будет достаточно просто реализовать. И попробую в выходные как раз сделать такое для DisAsm-а

Hunta
26.09.2022, 12:26
И снова - не совсем про DisAsm, но тема, связанная с Windows хоть как-то - вроде только эта у меня.

Переделка моего недо-сайто-пере-файлопомойки :) Перенёс на Windows посвежей, сделал два хоста с балансировкой и автоматической репликацией. Снаружи, прадва, балансировка самая примитивная - через dns, зато внутри - nlb от Windows :) Ну и добавил (наконец-то) резервное копирование. Всё это последствия небольшого апгрейда дисковой подсистемы на серверах :)

Возможно, что-то будет сбоить и - если что-то сильно надо - пишем в личку :)

Hunta
03.10.2022, 21:20
Таки дошёл до DisAsm-11, но не в плане доработок. Итак, по порядку.

- Поигрался с Shared Projects. На старых проектах - загнал в Shared Projects, в том числе - историю изменений - локальный git, в том числе - с процедурой Main (их переделал в dll проект), сделал два новых (один под .NET 4.x, второй - под .NET 6), настроил запуск кода старого main проекта - получил на выходе два exe-шника, один из которых будет работать под XP (плюс проблемы с длинными именами), второй - не будет иметь проблем с длинными именами (но не будет работать под XP). Проект для XP использует некоторые вкусности из 4.8 и C# 10, но пришлось ручками добавить функционал, что бы их использовать. В принципе - не сложно. Типа модуля совместимости.

- Долго воевал с тем, что бы засунуть ресурсы в Shared Project. Не смотря на то, что в инете пишут, что не всё будет работать, удалось почти все проблемы порешать и заставить работать. Правда, пришлось файл проекта слегка допилисть ручками и открыть хак - что нужно сделать после изменения ресурсного файла, что бы перегенерировался файл с кодом. Может, где то в инете это и есть, но я найти не смог. Осталось поиграться с локализацией через ресурсный файл, но это потом.. как-нибудь.

- Начал запихивать DisAsm-11 в Shared Projects. Прицел примерно тот же - сборка для разных .NET. А то уже были просьбы сделать под XP, плюс мне понравился .NET 6 - но держать несколько проектов и их синхронизировать как то в лооооом :) С Shared Project это будет влёт.

Думаю, за завтрашний вечер запихаю DisAsm-11, поправлю косяки (если будут) - и можно будет развивать дальше :)

S_V_B
04.10.2022, 10:35
Ты конечно большой молодец, но где пруфы, ридми и крайние версии... и.т.д. Я уже много лет пользуюсь Идой, в чем твой профит?

Hunta
04.10.2022, 11:02
но где
Всё на первой странице и в остальных сообщениях


Я уже много лет пользуюсь Идой
Ну так пользуйся, я то здесь причём? Меня её результат не устраивает, поэтому не пользуюсь

S_V_B
04.10.2022, 11:12
Всё на первой странице и в остальных сообщениях
Там написано «очень старая версия»... И в чем не устраивает результат?

Hunta
04.10.2022, 11:22
Там написано «очень старая версия»
Ну посмотри на другие


И в чем не устраивает результат?
Результатом

Hunta
04.10.2022, 20:59
Всё, перетащил под новый подход в разработке и DisAsm11 :)
Можно продолжать пилить код дальше :)
А прервался я на равлечениях с перекрытиями :)

- - - Добавлено - - -

Толком проверить вариант под .NET 4.0 (с прицелом на XP) не могу - нет под рукой виртуалки с XP, а ставить лениво. Но по логике - должно работать. Вариант под .NET 6 требует установки соотвествующего run-time-а, для которого минимальная версия, вроде бы, Windows 7. И её тоже под рукой нет. Но вот её поставлю скорей, чем XP - просто в силу того, что не только развлекаюсь с DisAsm-ом, но и с .NET 6 :) Хотя, может быть, в выходные и запущу устаановку-настройку обеих операционок - должны в заначке остаться скрипты

- - - Добавлено - - -

Заодно нашёл и пофиксил ошибку :) Командная строка - отличная вещь для автоматизации тестирования :)

Sandro
05.10.2022, 06:29
Всё на первой странице и в остальных сообщениях

Где хоть одна ссылка "Скачать DisAsm-11"?

- - - Добавлено - - -

Кстати, у тебя ещё и картинки на kpxx.ru тухлые, ты в курсе?

Hunta
05.10.2022, 07:47
Где хоть одна ссылка "Скачать DisAsm-11"?
Читаем внимательно первое предложение в первом сообщении


Кстати, у тебя ещё и картинки на kpxx.ru тухлые, ты в курсе?
Проверил, открываются по обеим ip

CodeMaster
05.10.2022, 08:05
Проверил, открываются по обеим ip
Не все под VPN 24/7

77902

Hunta
05.10.2022, 09:08
Не все под VPN 24/7
Такое у меня изредка бывает, но после обновления (ctrl-f5) начинает показывать нормально. Пока в силу крайней невоспроизводимости не могу понять, в чём дело.
Серваки стоят рядом, в кладовке, так что никакого vpn не требуется

- - - Добавлено - - -


Кстати, у тебя ещё и картинки на kpxx.ru тухлые, ты в курсе?


Не все под VPN 24/7

Вроде нашёл источник проблемы, поправил

- - - Добавлено - - -

А вот нет нефига.. периодически опять всплывает.. ок, буду разбираться

В общем, для определения того, чего не так, пока изменил настройки. Посмотрим, как оно будет.

S_V_B
05.10.2022, 16:16
Пиши на чистом си

Hunta
05.10.2022, 17:07
Пиши на чистом си
Я сам решу, на чём писать.

Sandro
07.10.2022, 10:22
Читаем внимательно первое предложение в первом сообщении


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

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

Hunta
07.10.2022, 10:47
По моему мнению, если программу приходится выпрашивать, то это -- не является свободным доступом.
Где я писал, что она в свободном доступе?
И поскольку она в процесс развития - особого интереса в увеличении аудитории у меня пока нет. Да и в принципе со своими поделками я интересом в увеличении аудитории - не страдаю.


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


Например, я не хочу и не собираюсь ничего выпрашивать

Это - твои проблемы.

Hunta
18.11.2022, 20:08
Наигрался и слегка устал от ImageUtils, да и на впечатлениях от SmartArray появились идеи для DisAsm, решил поиграться с ними.

Прицел всё тот же - поддержка образов с перекрытиями, но налетел я тут на специфическое ПЗУ от M11 - задумки пойдут и для него.

Пока - изменение внутренних механизмов работы с дизассемблируемым, нужное для вышенаписанного нижеподписавшемуся :)

Хунта

Hunta
19.11.2022, 17:52
Добавил функционал служебных ячеек - то есть ячеек, которые несут всякую служебную информацию и не дизассемблируются.

Пока используются для (и отлаживались на) блочных комментариях - они стали вполне себе самостоятельными ячейками и не привязаны к ячейке, надо которой выводятся.

Как было - выделятся и блочный комментарий и ячейка, с которой он связан (http://www.KpXX.Ru/Soft/Utils/DisAsm11/disasm11-036.jpg)

Как стало - при выборе блочного комментария выдялется только он (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-038.jpg)

Ну и блочные комментарии стали первыми динамическими ячейками - добавляем комментарий - они добавляются, блочный комменатрий становится пустым - ячейка удаляется.

В ближайших планах - добавить служебные ячейки-выключатели (позволят выключать ячейки из дизасма, точно название пока не придумано) и возможность разбить (дизассемблируемое) содержмиое файла на "страницы" с заданием базового адреса - прицел идёт на ПЗУ M11, но второй функционал - и на оверлеи :)

В планах - служебные ячейки, которые позволят увидеть структуру LDA файлов - то есть - стартовый байт, адрес загрузки, длину и контрольную сумму и служебные ячейки из TSK файла.

Hunta
19.11.2022, 23:33
ячейки-выключатели - сложнее, чем я думал...

Hunta
20.11.2022, 11:27
В общем, на ПЗУ пока забил (надо думать) и переключился на оверлеи - всё равно механизм пригодится и там.

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

Из занятного. SmartArray вдруг всплыл в DisAsm :) Оказалось, что, когда я переделывал ImageUtils - под раздачу попал и DisAsm (темы связанные, всё в рамках одного solution в VS) - и оно работало вообще так хорошо, что я далеко не сразу заметил :) А когда заметил.. Решил попробовать. Обработки битовой карты загрузки из SAV - было



fInfo.SavBitMap[0] = fInfo.BProg["360".Octal()]; // 000000-007777
fInfo.SavBitMap[1] = fInfo.BProg["361".Octal()]; // 010000-017777
fInfo.SavBitMap[2] = fInfo.BProg["362".Octal()]; // 020000-027777
fInfo.SavBitMap[3] = fInfo.BProg["363".Octal()]; // 030000-037777
fInfo.SavBitMap[4] = fInfo.BProg["364".Octal()]; // 040000-047777
fInfo.SavBitMap[5] = fInfo.BProg["365".Octal()]; // 050000-057777
fInfo.SavBitMap[6] = fInfo.BProg["366".Octal()]; // 060000-067777
fInfo.SavBitMap[7] = fInfo.BProg["367".Octal()]; // 070000-077777
fInfo.SavBitMap[8] = fInfo.BProg["370".Octal()]; // 100000-107777
fInfo.SavBitMap[9] = fInfo.BProg["371".Octal()]; // 110000-117777
fInfo.SavBitMap[10] = fInfo.BProg["372".Octal()]; // 120000-127777
fInfo.SavBitMap[11] = fInfo.BProg["373".Octal()]; // 130000-137777
fInfo.SavBitMap[12] = fInfo.BProg["374".Octal()]; // 140000-147777
fInfo.SavBitMap[13] = fInfo.BProg["375".Octal()]; // 150000-157777
fInfo.SavBitMap[14] = fInfo.BProg["376".Octal()]; // 160000-167777
fInfo.SavBitMap[15] = fInfo.BProg["377".Octal()]; // 170000-177777


Стало



fInfo.SavBitMap = (SmartArray<byte>)fInfo.BProg[("360".Octal())..("400".Octal())];

Hunta
20.11.2022, 16:28
Вроде бы LDA формат изучен вдоль и поперёк (хотя ещё на попался файл с длиной записи 5 байт), а ещё может преподносить сУрпризы :) Всего-то захотелось показывать служебку - и понеслася :)

Но вроде и его (последний оставшийся) формат перенёс на новый вариант загрузки инфы в дизасм. Может, какие ещё косяки остались, но скорее всего только отладка, а не переделка. ТТТ :)

Hunta
20.11.2022, 20:52
Повылазившее на тестировании (в том числе и не умевшее отношение к переделке) - пофиксил, теперь все типы файлов обрабатываются новым способом. И я всё ещё косюсь на оверлеи и страницы. Не знаю только, сколько сегодня успею сделать.. Если успею :)

- - - Добавлено - - -

Думаешь сделать одно, а получается (быстрее) другое :) Это не окончательный вариант, а просто пристрелка - что бы увидеть - а как оно вообще :)

Теперь видна структура LDA файла (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-039.jpg)

В частности то, что очередной блок может иметь нечётную длину и нечётный адрес загрузки :) Добро пожаловать в мир восьмибитных носителей :)

Hunta
21.11.2022, 19:13
Упорство и упрямство, а так же - неожиданные шатания по поводу того - что делать следующим.

Тем не менее :)

И - это пока концепт, причём идёт отработка внутренностей, так что совсем не факт, что ОНО так будет выглядеть потом :)

Пока так, дальше буду думать - как :) (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-040.jpg)

Hunta
22.11.2022, 20:12
Multiuser EDT, прилинкованный к supervisor FCSRES выносил мозг полдня :) Но - мы не привыкли отступать. Не совсем (далеко не совсем) ещё разобрался, но уже начинает что-то вырисовываться :)

Красота :) (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-041.jpg)

Или :) (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-042.jpg)

- - - Добавлено - - -

Multiuser EDT, прилинкованный к обычной FCSRES - тоже сволочь.. Тоже не зашёл с первого раза...

Hunta
25.11.2022, 18:13
Определённые подвижки есть, скажем, теперь все три варианта EDT нормально грузятся в программу, с показом структуры перекрытий. Но по прежнему идёт борьба за правильно определение структуры перекрытий и подгрузки частей программы в хранилище для анализа. Что играет против :) меня:

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

И всё это в перемешку и по отдельности :)

Надо ещё будет добавить код, который будет контролировать - все ли блоки из дизассемблируемого файла попали под раздачу :)

И - пока идёт борьба с загрузкой, потом начнётся допиливание модуля дизассемблирования :)

А ещё значительная часть этой хрени есть и в RT-11 :)

Hunta
27.11.2022, 00:49
Вроде как осталось только сделать правильную подгрузку программ с поддержкой пространств с кодом и данными и оверлеями и подгрузку резидентных библиотек (а так же разбор их STB файлов)
Ну и проверять-проверять-проверять.

Так же нужна доработка декодировщика команд для поддержки оверлеев, а вот тут ещё и отработка определения - в какой оверлей полез код. Вниз по дереву немного проще, вверх, вбок и в другое дерево - сложней, надо разбирать вектора загрузки. Ну и генерация меток.

Пока по прежнему ВСЯ программа загоняется в один .MAC файл (что не есть правильно) и не генерируется файл для TKB.

Кстати, надо сделать и генерацию файла для компиляции и сборки для всех типов файлов :)

Hunta
06.12.2022, 00:44
Добавление подтипов файлов
Начало добавления кода интеллектуальной обработки подтипов
Начало работы автогенерации обращения к макросам (в зависимости от типа и подтипа, пока отработка концепции)
Активное использование и, как следствие, активное исправление ошибок и шерховатостей

Hunta
10.12.2022, 21:22
Очень ранний концепт (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-043.jpg)

Список .MCALL генерируется автоматом (но надо допилить, что бы разбивался при необходимости на несколько строк) (готово)
Надо дописать генерацию метки на макрос, если первая его команда - с меткой (готово)

Отработка концепта идет (та-дам!) на RT11 v1.15 - в силу простоты иховых макросов

Ну и пока это ЕДИНСТВЕННЫЕ и НЕ ДО КОНЦА сделанный (у него есть второй аргумент) макрос. Просто ещё идёт отработка концепта в целом - как встраивать, визуализировать и какие нюансы (типа меток) могут при этому вылезти. Хотя в принципе могу уже накидать примерно так порядка трёх десятков макросов :)

- - - Добавлено - - -

А, да, надо, помимо автоматической генерации макро-вызовов, добавить и ручную работу с ними :) (частично готово, но на предмет отдельной кнопки Макро - размышления, пока автооопределение по кнопке Код)

Hunta
11.12.2022, 01:37
Двигаюсь вперёд (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-044.jpg)
Практически все замеченные кривоватости из предыдущего сообщения пофиксины.
Добавлены почти всё макросы из RT11 v1.15 - с учётом того, что разбирается максимум один аргумент - номер канала, но это следующая цель - остальные аргументы макроса.
Из следующих целей - макросы из следующих версий, а так же возможность генерировать программу под определённую (исходно подразумевается - под родную) версию RT - такой функционал БЫЛ заложен в макросы RT, посмотрим, насколько получится это определить.

Hunta
11.12.2022, 11:18
На свежую голову пофиксил ещё тройку сценариев - не критично для генерируемого MAC файла, но как-то неаккуратненько.
Теперь подход генерации остальных аргументов макросов...

Hunta
11.12.2022, 22:21
Очередной первый шаг (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-045.jpg) :)
В левом (основном) окне - пример .LOOKUP с двумя аргументами, в правом верхнем - пример .LOOKUP без параметров, в правом нижнем - список макросов, которые были найдены на текущий момент в PIP.SAV

Ну и поскольку отработка механизма и отладка - пока только для .LOOKUP

.LOOKUP - это ещё из более простых макросов, .TTYIN будет посложней, но... Мы не привыкли отступать :)

Hunta
12.12.2022, 10:47
Попробовал доописать .ENTER... Блин, юные хакеры из DEC. Самомодифицирующийся код - да без проблем :) Попробую использовать EDIT для экспериментов-отладки :)

- - - Добавлено - - -

Очередной второй шаг (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-046.jpg)
Попробовал доописать .ENTER. В целом предсказуемо отработал без проблем, но выявились недочёты в поведении - не фатальные - при необходимости комбинацией команд Сброс - доп команды - Код всё устраняется, но.. хотелось бы меньше нажатий кнопок-щелчков мыши. Так что запущен процесс устранения, а потом буду доописывать следующий макрос. И смотреть на результат :)

В позапрошлом сообщении ошибся - это был не очередной первый, а очередной второй шаг :)
Первый шаг - чисто кодом
Второй шаг - data driven
Третий шаг - описание во внешнем файле

До третьего надо наиграться с разными вариантами во втором :)

Hunta
12.12.2022, 13:14
Отработку команды Сброс сделал более логичной и поправил визуализацию макровызова, если команда, входящая в его состав как-то меняется. Например, непосредственный аргумент-число меняется на ссылку. Ну и пару косяков-ошибок поправил.

Можно двигаться дальше с добавлением описаниев макросов.

Hunta
12.12.2022, 20:55
Изначально была заложена идея реагирования парсера макро-вызовов на ключвевые команды. Пока ключевая команда только одна - EMT. Точнее, пока только она и используется в блоке описания, но даже сейчас можно использовать какую угодно команду. Но даже в RT 1.15 есть макровызовы, которые используют одинаковый код в EMT и отличаются аргументами. Парсер на основании описания успешно справляется с такими вариантами :)

Пример - .FETCH/.RELEASE (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-047.jpg)

Будет добавлен функционал, когда макро-вызов использует и блок данных (типа AREA у RT или $ вариант у макросов RSX)

11 макросов из примервно 34-ух (когда все опишу - будет понятно - сколько их в макро-библиотеке)

- - - Добавлено - - -

Вдогонку. Когда описание будет перенесено во внешний файл, можно будет настраивать парсинг и под кастомный вариант, как скажем, в EDIT - когда у него свои макровызовы :)

- - - Добавлено - - -

23 макроса описано, 10 осталось - по три варианта .READ и .WRITE и по два .TTYIN и .TTYOUT.
.READ и .WRITE проще (думаю, сегодня сделаю), .TTYIN и .TTYOUT посложней, - над ними ещё подумать надо

Hunta
13.12.2022, 07:47
29 макровызовов

Остались четыре .TTYxxx (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-048.jpg)

Думаю, что начну добавлять макросы из RT 2.x, а в процессе допилю поддержку .TTY, благо они не изменялись.

Ну и поскольку придумал сценарий, где может понадобиться кнопка MCALL, то добавлю и её.

Так же можно начинать обдумывать третий шаг - вынос описания макросов во внешний файл

Hunta
14.12.2022, 19:47
Пока отлаживал генерацию макросов для RT-11 v1.15, смотрел на дизасм PIP и EDIT и по EDIT возникло непонимание. Решил, что битый EDIT.SAV. Но поскольку доскональный дизасм было лениво проводить, решил проверить по быстрому другим путём. Так что встречаем сеанс работы с первой версией RT-11 :)


.BOO/FOR RK0:

@ 000006
@0G
RT-11 V01-15

.R EDIT
*EWTEST.MAC$$
*I
.TITLE TEST
.MCALL .PRINT
.MCALL .EXIT
START:
.PRINT #DEMO
.EXIT
DEMO: .ASCIZ /RT11 V1.15/
.EVEN
.END START
$$
*EV$$
V01-24
*EX$$

.R PIP
*/L

DTMON .SYS 34 25-JUL-73
MONITR.SYS 34 25-JUL-73
LP .SYS 2 26-JUN-73
RK .SYS 2 28-JUN-73
PR .SYS 2 22-JUL-73
PP .SYS 2 26-JUN-73
DT .SYS 2 26-JUN-73
TT .SYS 2 26-JUN-73
LP .132 2 26-JUN-73
SYSMAC.SML 8 26-JUN-73
PIP .SAV 8 9-JUL-73
EDIT .SAV 15 22-JUL-73
MACRO .SAV 29 26-JUN-73
LINK .SAV 14 9-JUL-73
EXPAND.SAV 12 3-JUL-73
ASEMBL.SAV 21 26-JUN-73
PATCH .SAV 5 26-JUN-73
ODT .OBJ 9 26-JUN-73
PIPC .SAV 12 25-JUL-73
TEST .MAC 1
4570 FREE BLOCKS
*^C

.R MACRO
*TEST=TEST
ERRORS DETECTED: 0
FREE CORE: 19465. WORDS

*^C

.R LINK
*TEST=TEST


*^C

.R PIP
*/D
*/L

DTMON .SYS 34 25-JUL-73
MONITR.SYS 34 25-JUL-73
LP .SYS 2 26-JUN-73
RK .SYS 2 28-JUN-73
PR .SYS 2 22-JUL-73
PP .SYS 2 26-JUN-73
DT .SYS 2 26-JUN-73
TT .SYS 2 26-JUN-73
LP .132 2 26-JUN-73
SYSMAC.SML 8 26-JUN-73
PIP .SAV 8 9-JUL-73
EDIT .SAV 15 22-JUL-73
MACRO .SAV 29 26-JUN-73
LINK .SAV 14 9-JUL-73
EXPAND.SAV 12 3-JUL-73
ASEMBL.SAV 21 26-JUN-73
PATCH .SAV 5 26-JUN-73
ODT .OBJ 9 26-JUN-73
PIPC .SAV 12 25-JUL-73
TEST .MAC 1
TEST .OBJ 1
TEST .SAV 2
4567 FREE BLOCKS
*^C

.R TEST
RT11 V1.15

.


Из занимательного - при работе на полной скорости под эмулятором Патрона - видимо дурит RK (или драйвер - не разбирался), что сопровождается фейерверком проблем, который начинается с того, что портится системный диск :)

С редактором EDIT имел дело только под DOS/Batch-11 в 1984 году, некоторые вещи вспомнились, некоторые - пришлось глянуть в документацию :)

- - - Добавлено - - -

А, да, ещё - до какого-то момента в PIP был функционал, которые потом разделили на PIP и DUP. То есть, скажем, создание системного диска и перезагрузка системы - это был PIP :)

Hunta
31.12.2022, 12:59
После долгой борьбы за использование новых возможностей компилятора и .NET и в ImageUtils и DisAsm-11 для .NET 4.x решил всё таки отказаться от поддержки .NET 4.x.

Так что новые версии пойдут (на текущий момент) только под .NET 6.

И насколько я понял из написанного у MS, это означает Windows 7 sp1 и Windows 2012 минимум. Позднее проверю, на какие версии Windows может встать .NET 6

Hunta
02.01.2023, 13:33
В общем.. Идея, которая нарисовалась в голове, с ходу (даже в .NET 6) не взлетела. Вернулся к предыдущей точке, в том числе - и к поддержке .NET 4.x. Буду ещё думать.
И пока переключусь на PDP-2011, там тоже есть задумки, посмотрим, как с ними получится...

Hunta
22.06.2023, 17:57
Наткнулся на статью на хабре - как дизассеблили (из байт кода) одну прогу на питоне. Пара кусков текста оттуда (лично я IDA не использую, так что написанно - чисто на совести авторов):

"Лично я не догадался, пока не увидел, что функция pyarm, вызываемая между этими двумя действиями, весит целых 50 (!) КБ. Чтобы вы понимали – 1 машинная инструкция на x86-x64 занимает в среднем 4-5 байт, то есть наша функция выполняет более 10 тысяч операций, при этом её декомпилированный код занимает ~146 тысяч строк."
...
Ситуация осложняется размером функций – IDA Pro работает в однопоточном режиме, и если вы попытаетесь переименовать какие-либо переменные в функции pyarm, чтобы обозначить места соответствия с настоящей _PyEval_EvalFrameDefault, то каждый такой небольшой манёвр обойдётся вам в несколько лет (интерфейс IDA Pro зависнет на 3-10 минут при каждом изменении декомпилированного кода)."

То есть получается, что переименование некоего объекта в IDA - проход по всему дизассеблированному тексту и изменение. Ндя.. У меня в DisAsm сделано по другому - вместо получения дизассемблированного текста и работы с ним - на ячейки (байты и слова) выставляются аттрибуты и при отображении на экран (или вывод в генерируемый исходник) DisAsm анализирует аттрибуты и по ним генерирует исходник. Поэтому при изменение метки (а это изменение аттрибута) выполняется мало действий (и я собираюсь сделать их ещё меньше). А когда будет отображаться или выводиться исходник - идёт просмотр - о, текущая команда ссылается на ячейку - а на той ячейки метка есть? - нет - генерируем метку по умолчанию, да - берём заданную метку и подставляем. Всё. Никаких поисков и изменении (будущего) исходника при смене метки :)

Hunta
09.10.2023, 16:04
Видимо, устал от PDP-11X, так как совсем не хотелось что-то делать и думать.
Ну ок, в силу некоторых обстоятельств переключился на XXDP :) А что бы понять - чего там не работает в программе - подсунул в дизасм. А он того.. лабуду лепить начал и падать :) Ну понятно, не постоянно и неповсеместно, но.. всё таки :)
Так что некоторое время шуршу в его коде. Всё замеченное было вычисленно и поправлено. Пока в дизасме одной утилиты (а может и что-то ещё отдизассемблю) из XXDP

BlaireCas
13.10.2023, 10:10
А как бы заполучить этот ДизАсм11? Товарищ Хунта, поделитесь екзешником. Вещь судя по картинкам нормальная, годная. А где екзешник лежит - неясно.

Hunta
13.10.2023, 10:25
А как бы заполучить этот ДизАсм11?
Легко :) Как я уже писал, некоторая часть моих прог - RequestWare, то есть пишется мне сообщение (в теме или в личку), после чего всё щастливы :) Или по какой-то причине нещастливы :(

По поводу DisAsm-11. Я сейчас занят диазсмом одной проги - а в такие моменты весьма часто DisAsm-11 дорабатывается - как раз - как сейчас. Скорее всего, на выходных доработки будут зафиксированы - и я напишу в личку - откуда можно будет забрать. Ну и всякие детали по использованию.

Только нужно помнить - программа писалась под мои хотелки, какого-либо плана - что должно быть - не было, развитие шло по принципу - написал первый вариант, попробовал поиграться, решил, чего не хватает, дописал, попробовал поиграться - и так далее. Пожелания от других В ПРИНЦИПЕ рассматриваю, но вот будет ли реализовано.. в первую очередь зависит от того - решу ли я, что доработка полезная, во вторую очередь - от наличия свободного времени и когда я в очередной раз сяду за доработки..

Ну и тестирование написанного тоже идёт в процессе игр - так что ошибки возможны (вот в очередной раз игр исправил порядка трёх). Если натолкнешься на ошибку - списываемся и решает проблему.

Hunta
14.10.2023, 01:07
После примерно недели возни с дизасмом программы и исправления ошибок в самом DisAsm-11 на выходе был получен файл, в котором была всего ОДНА ошибка (я пропустил эту неточность в команде и это моя вина, а не вина DisAsm-а) и который после её исправления, трансляции, сборки и сравнения с исходным файлом дал результат:

Comparing files DXCL1.SRC.MAC and DXCL1.REGEN.MAC
FC: no differences encountered

Пояснения, почему участвуют не двоичные файлы, а какие то MAC - потому как это LDA формат, в отношении которого я НЕ ЗНАЮ, как получить идентичный двоичный файл, даже если взять самый что ни на есть исходник (скажем - от DEC) скомпилировать и собрать его. На выходе всё равно будет другой файл. Точнее, я догадываюсь, как получить идентичный LDA - надо компилировать тем же самым компилятором (вплоть до версии и апдейтов) и собирать тем же самым компоновщиком - но вопрос - как определить - какими и под какой операционкой. Так что я пошёл на хитрость - я беру исходный и полученный новый LDA файлы, прогоняю оба в автоматическом режиме восстановления исходника - и сравниваю полученные файлы. Как показали эксперименты - если полученные файлы ИДЕНТИЧНЫ, то и дизассеблированный исходник можно считать идентичным двоичному файлы. Ну или пока я не налетал на вариант, когда это не так :)

Определённые шерховатости в DisAsm-е есть, но пока результат я фиксирую - то есть именно эта версия будет использоваться мной и отдаваться по запросу. Пока я не узнаю про какие-то ошибки в DisAsm-е или не возьмусь опять за доработки (мысли есть, времени свободного мало)..

Ну а пока пойду спаааать...

BlaireCas
14.10.2023, 03:40
Мне бы просто куски кода подизасмить без кучи всяких наворотов. Поэтому не откажусь от той версии которая есть прямо вот сейчас. Итого жду сообщения где скачать. Бочку на софт катить не буду и бугуртить тоже.

Hunta
14.10.2023, 15:00
Итого жду сообщения где скачать
Написал


Бочку на софт катить не буду и бугуртить тоже.
Сообшения об ошибках (особенно!) и аргументированные претензии только приветствуются :)

- - - Добавлено - - -

В процессе написания и проверки инструкции по использованию наткнулся на (неприятную, но не фатальную) ошибку - пришлось быстро фиксить :)

Hunta
16.10.2023, 18:47
Для создания PIC (position independent code) часто используется такой код


MOV PC, reg
ADD #LABEL-., reg


Давно присматривался к возможности создания таких (относительных) ссылок.
Созрел :)
Пока концепт (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-049.jpg), но уже что-то работает :)
Ну и подход стандартный - подсказка об особенностях ячейки DisAsm-у, дальше он всё делает сам :)

- - - Добавлено - - -

Надо проверять полную работоспособность (в том числе в недомакросах), но это постепенно :)

- - - Добавлено - - -

АААААА, почему я это раньше не сделал!! :D

Hunta
17.10.2023, 00:23
Вроде как один сценарий PIC работает в простом случае (вне макросов) Ок

Hunta
18.10.2023, 00:11
Сценарий из разряда - пишу код для поддержки относительных указателей и чувствую - его как-то всё больше-больше и не по делу :) Остановился, большую часть изменений откатил и нарисовал заново. Меньшим количеством кода :) Так что по прежнему тестирую стандартные сценарии до макросов

Hunta
18.10.2023, 09:27
И (недо)макросы тоже неплохо справляются :) (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-050.jpg)

Hunta
18.10.2023, 12:08
Я не знаю, ЗАЧЕМ понадобилось делать так (и код этого монитора пока не особо разбирал), но вот такой вариант встретил в советском ТМОС (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-051.jpg) и теперь DisAsm справляется и таким и с классическим вариантом PIC кода :)
В целом, тот функционал, который хотел - сделал, теперь прическа кода и (расширенное) тестирование :)

Hunta
18.10.2023, 20:45
Небольшой рефакторинг - избавление ядра DisAsm от зависимости от конкретики (PDP-11).
Заготовка на будущую возможность дизасмить не только код от PDP-11 :)

Hunta
19.10.2023, 21:21
Это был второй подход к задаче "Сделать ядро конкретико-независимым" :) Вначале пошёл примерно по тому же пути, что и в первый раз.. Нууу.. с таким же результатом - откатил всё :) Почесал почесуемое и решил зайти с другой стороны, а так же разбить задачу на части :) Первым начал избавлять от зависимости модуль, показывающий окно с интерфесом и визуализации. Полного избавления от зависимости нет, но начало положено - теперь модуль заивисит не от класса, а от интерфейса. Двигаюсь дальше :)

Hunta
20.10.2023, 12:14
Чистка зависимостей от архитектуры PDP-11 продолжается. Подход тот же - чищу сверху вниз, а не снизу вверх (как в первых двух попытках).

Hunta
21.10.2023, 19:38
Визуализирующая часть - теперь не зависит от PDP-11.
Работа с файлами - разделена на обобщённую часть, парсеры и массив-описатель известных парсеров.
На очереди выпиливание PDP-11 зависимого из работы с командной строкой.

Hunta
22.10.2023, 01:15
Немножко поторопился - визуализирующая часть ещё зависит от PDP-11, точнее - часть кнопок интерфейса и визуализация оверлеев.
Остались вроде:
- работа через командную строку (тут подумать надо)
- кнопки на окне программы (ну, тут в принципе более менее понятно)
- класс для работы с оверлеями - распилить на общую (части, нужные для визуализации) и PDP-11 зависимую части

Hunta
22.10.2023, 18:06
Кнопки отрезаны от конкретики. На первый взгляд - осталось отрезать только оверлеи и командную строку.

Hunta
23.10.2023, 08:40
Распилил класс работы с перекрытиями. Не совсем оптимально и не так, как хотелось, но пока как получилось. Оптимизировать буду постепенно :)
Вроде как осталась только командная строка..

Hunta
24.10.2023, 11:21
Всё, разборку командной строки тоже отвязал от PDP-11. Большое тестирование - что где я мог сломать :)

Hunta
25.10.2023, 00:15
Ну куда жжжж без ошибок то :)
Это даже не ошибка, это именно грубый ляп - при вычислении операндов для режимов 67 и 77 :)
Исправил :)

- - - Добавлено - - -

Ещё одна, но уже неточность - при пометке ячейки как указателя. Выявлено в коде парсинга описания структуры перекрытий в TSK файлах

- - - Добавлено - - -

Шерховатости с выставлением стартового адреса для TSK (в варианте /MU - многопользовательская задача)

- - - Добавлено - - -

Ещё шерховатость в пометке ссылок на ячейку
Осталось немного отличий с "эталонным" .MAC файлом. Он был получен ранее и (сюрприз!) новый вариант DisAsm-a определил примерно на три процедуры больше (в старом они дизассемблены как данные :) )

Hunta
27.10.2023, 00:14
Доделал, поправил и причесал код работы с указателями. Если в ближайшие дни новых ошибок не вылезет, то пока работы с DisAsm фиксирую. Дальше хочу повозиться с ImageUtils - и как и с DisAsm-ом - последствия моих разборок с XXDP :)

Hunta
28.10.2023, 21:08
Давно задумывавшаяся переделка и (потенциальное) расширение DisAsm-11
Но как обычно - поскольку это только потенциальное - руки не доходили. В этот раз чего-то пропёрло :)
Серия картинок (не полноэкранное, только изменившаяся часть :) )
Лишние кнопки скрываются (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-052.jpg)
Поскольку сохранённый сеанс самодостаточный и в нём нельзя поменять типы разного - вынесен на вехний уровень (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-053.jpg)
Опять же - когда дальше выбора нет - лишнее не показывается (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-054.jpg)
Варианты (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-055.jpg)
Выбрали (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-056.jpg)
Решил включить фильтр по типу файлов (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-057.jpg)
А тут есть третий уровень (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-058.jpg)

- - - Добавлено - - -

Посмотрел, подумал и - добавил опцию - показать все файлы :) Мало ли :)

Hunta
28.10.2023, 23:53
Поигрался (в смысле - и потестировал малость) с новым вариантом. Из непонравившегося - в командной строке надо указывать полный набор, типа - /pdp11 /rt11 /sav
Надо будет реализовать вариант поиска по принципу - минимально достаточной инфы - то есть - /sav - он только в описании pdp11+rt11 встречается - значит - /pdp11 и /rt11 подразумевается. Но это завтра, в смысле - спать хочется, вот встану и попробую допилить :)

Hunta
29.10.2023, 18:21
Допилил разборку командной строки до разборки по принципу разумной достаточности, то есть - указал ключ, скажем, /tsk - программа сама поймет, что то /pdp11 и /rsx.

Попутно пришла в голову мысль, что одинаковые файлы могут быть в разных ОС (DOS-11 и XXDP).

И (внезапно)! обнаружилось, что если в командной строке не указать ключ /generate - то программа просто откроет (и первоначально обработает) файл в графическом режиме. Автор забыл про то, что умеет произведение. Но вот параметры в выпадающих списках она по загруженному файлу не выставила (так и остался висеть Сохранённый сеанс), что с одной стороны - фиолетово (ибо дальше они не на что не влияют - только при открытии файла - а это уже было задано ключами), а с другой стороны - "Неаккуратненько как то, доктор!"

Второе поправить проще, поэтому начну с него :)

- - - Добавлено - - -

Другое дело - теперь правильная инфа о файле :)

Первый пункт в работе...

Hunta
29.10.2023, 20:59
Разбор командной строки поправил. Фаза тестирования. Ну, по мере использования, а не специально гонянние тестов :)

- - - Добавлено - - -

А, да, чего-то мне стукнуло в голову - сделал возможным изменение размеров окошек с исходным текстом :) Не то, что бы это ОЧЕНЬ нужно было, но вдруг захотелось. А поскольку это дело на 5 минут правок описания интерфейса и ни одной строчки кода - пуркуа бы и не па :)

Hunta
30.10.2023, 09:16
Для полноты картинки добавил в список так же CAPS-11 :) Формат у неё тот же - LDA (по крайне мере для основной массы файлов), но, как и в случае XXDP/DOS-11 - свои системные вызовы. Кстати, одна из операционок для PDP-11, в которой ассемблер не поддерживает макросы, то есть - вариант PAL-11. Надо посмотреть по документации - как вообще в CAPS-11 происходят вызовы системы :) В принципе - можно добавить в дизасм и макросы под это дело, только транслировать придётся под чем-нибуть типа RT-11. Надеюсь - OBJ у них с CAPS-11 похожие :)

Hunta
01.11.2023, 10:43
"Неожиданное" применение кода из DisAsm :)



8.842.006-12.Редактор текста.var.1.ptap

** ** ** ** ** ** ** * **
* * * * * * * * * * * * * ** * *
** ** **** * * * * * *** *** * *
* * ** * * * * ** * * * * * * * *
** ** ** * **** ** ** ** ** *** ****

С адреса : 000004
По адрес : 012607
Стартовый адрес: 012416


000245 Начало записи 001 000
Счётчик байт 52
Адрес загрузки 000550
КС 045

...

Hunta
02.11.2023, 09:57
Пофиксил некоторое количество неточностей при разборке командной строки.
Плюс вспоминл про модуль поиска системных вызовов (а-ля макросы). Там, конечно, на текущий момент - жуткая жуть - был реализован (доведён до работающего состояния) первый пришедший в голову вариант. Описываются макросы сложно и через код. Но - работает - ради пробы добавил три макроса под XXDP (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-059.jpg)

В планах (не ближайших) (как и некоторые другие вещи) - вынести всё это дело во внешний файл. То есть - всё таже отвязка ядра DisAsm-11 от зависимостей :)

P.S. На вопрос - чё за код такой странный в раскрытии макроса - не отвечу. Оно так былО в программе :)

- - - Добавлено - - -

Добавил ещё некоторое количество макросов. Дальше - вечером, после работы..

Да, ещё вчера малость попилил зависимости модуля макросов от общей организации DisAsm. Прицел - перевести вызов этого модуля на второй этап обработки входного файла (когда первоначальный автоматический разбор сделан), а так же - в модуль обработки команды C (Code).

Hunta
03.11.2023, 12:14
Добавил все(?) макровызова EMT для XXDP, на одной из программ из XXDP - играюсь и смотрю, что из этого вышло :)
Для этой программы я уже нарисовал эти вызовы в дизассемблированном исходнике руками - посмотрим, насколько совпадёт :)

- - - Добавлено - - -

На выходные попробую добавить что-нибудь из RSX :)

- - - Добавлено - - -

В общем, макросы описываются ака "Жуткая жуть" с некоторыми неочевидностями, но.. Работает! :)

Hunta
04.11.2023, 11:33
Периодически мысль возникала, но... Видимо, таких длительных игр с сохранением сеанса не было, так что - как возникала, так и пропадала :) А тут - не только возникла, но достало вспоминать - где я там прервался?? :) Так что теперь инфа о текущих ячейках сохраняется и после открытия файла сеанса - восстанавливается :)

Пока в проверках работы описанных макросов для XXDP и фиксах мелких недочётов...

Hunta
04.11.2023, 14:00
В процесс игр - обнуления флагов ячеек и выставления признака - Код (с автоопределением макровызовов) наткнулся на то, что обнуление флагов на макровызове осколками цепляет предыдущий макровызов, причём цепляет фатально - сам макровызов не обнуляется, а вот с его ячеек сбрасывается флаг, что они из макровызова. Разбираясь, наткнулся на (свой!) непонятный код. Такое впечатление, что была какая-то ошибка в определении макросов (а может были мыли про вложенные макросы - что, как мне сейчас кажется - глупость) - и вот она рванула. Закомментил, оставил комментарии, пофиксил - играюсь дальше...

- - - Добавлено - - -

Наткнулся так же на ошибку DisAsm и одновременно особенность дизассемблируемого файла. Выглядит так


5599 036272 M36272:
U 5600 036272 016765 002540 000006 MOV M36276, 6(R5) ; Ошибка! Должно быть K41036
5602 036300 001402 BEQ M36306


6294 040632 M40632:
6295 040632 104405 TRAP 5
6296 040634 RETURN
; 40636: ; Этот адрес уже за пределами файла

То есть, я предполагаю, что в исходнике было что-то типа


6294 040632 M40632:
6295 040632 104405 TRAP 5
6296 040634 RETURN
; 40636: ; Этот адрес уже за пределами файла
.BLKB 200
.... 041036 K41036:
...

но особенность LDA формата в том, что .BLKB и .BLKW в выходной файлы не попадос :)
Я уже рисовал код для правильной работы с такими ОТСУТСТВУЮЩИМИ ячейками в LDA, но, видимо, не всё корректно в датском королевсте :) Будем смотреть и фиксить :)

Интересно, как с таким справляется всеми любимый IDA (да ещё что бы и на выходе был файл, который проходит компиляцию стандартным MACRO-11 !) :)

Hunta
04.11.2023, 17:30
В целом, ошибка - да, именно ошибка. Так как в не LDA это как несколько нестандартная и, возможно, недопустимая ситуации. Особенно если учесть 67-ой режим адресации. DisAsm пытался пометить операнд как указатель, но не получалось (об этом дальше), а оно без проверки результата шло дальше. Это - пофиксил. Хотя (написанный мной ранее) код не понравился - в DisAsm есть несколько мест, где он начинает какие-то изменения во флагах ячеек, а потом по разным причинам сделанное отменяет. Вот этот подход - сделать и отменить - не понравился. Ещё и по причине того, что визуализация дёргается ажж два раза. Как сделать лучше - подумаю.

По особенности файла - как и ожидал - делал проверку - а не выходит ли адрес за пределы минимального и максимального адресов, которые были загружены из LDA. Подумал и пока закомментил проверку. Вроде как оказалось, что ситация встречается и поэтому не надо, но вдруг какие мысли ещё придут - что бы не вспоминать, чего написакал.

Играюсь дальше.

- - - Добавлено - - -

После исправленных в коде косяков сброса-генерации макровызовов (а потом в DisAsm-е много команд Clear и одна команда Code на каждый случай) и исправленного косяка и фичи генерации ссылок за пределы программы (а потом одна команда Clear и одна команда Code на каждый случай) результат автоматической генерации исходников из исходного .BIN файла и .BIN файла, полученного трансляцией и сборкой восстановленного .MAC) файла - идентичен. Из-за особенностей LDA формата сравнивать именно двоичные файлы бесполезно - не совпадут с вероятностью почти 100 процентов...

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

- - - Добавлено - - -

Разборки с векторами, когда они не в адресном пространстве :) Ну примерно тоже, как с 67, только в этом случае DisAsm а) генерит правильный код (и будет с 67-ым) и б) отказывается делать вектор вектором (по секретной команде V) :)

Hunta
05.11.2023, 12:50
Вроде и вектора-призраки привёл в чуйства :)

- - - Добавлено - - -

Добавил описание макровызова .LOAD - я в тот момент ещё вспоминал - как я макросы реализовал, этот показался сложным и я отложил его.. :)
Поправил (возможно, не всегда корректно) числа в ссылки.
.MAC по результат сборки и восстановления исходника по прежнему совпадает :)

Через какое-то время сравню с .MAC, который я начал делать до добавления генерации макровызов (сделал их руками) - посмотрим, что будет на предмет совпадения :)

Hunta
06.11.2023, 02:22
Проверка ручной генерации и генерации в DisAsm-11 макровызовов пройдена успешно :)

На самом деле, макросы XXDP ещё надо проверить по исходникам монитора - много макросов БЕЗ аргументов и по крайне мере в отношении некоторых точно известно (исходники мониторов), что аргументы передаются. Ну это постепенно.

Hunta
06.11.2023, 19:36
В процесс проверки восстанвливаемых текстов из LDA добавил доп проверку. Теперь утилитой LDAUtils делаю двоичные файлы и сравниваю так же их. Пока сюрпризов нет - если сравнились результаты автоDisAsm-а, сравниваются и двоичники.

- - - Добавлено - - -

Наткнулся на неточность в поведении DisAsm - если поменять метку, на которую ссылается команда, то всё ок, в команде метка также меняется, но если эта команда часть макровызова - то в макровызове не меняется. Технически обходится элментарно, но... надо будет посмотреть и поправить :)

Hunta
11.11.2023, 19:40
На самом деле, есть ещё один зависимый от PDP-11 модуль - генератор исходника. Но надо было время немного поиграться-потестировать с тем, что уже было сделано плюс - подумать над тем - как избавить его от зависимостей :)

Первый шаг сделан - в окнах показывается теперь более-менее полноценный исходник (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-060.jpg)

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

Hunta
14.11.2023, 12:37
По результатам доработок, а так же экспериментов с .TSK с перекрытиями - внутренние переработки.

Скорее всего, по результатам будет версия DisAsm-11, генерирующая несколько файлов для программ с перекрытиями (по файлу на каждое перекрытие). Там ещё остаётся много вопросов, но - постепенно буду двигаться :)

Возможно, по результатам попробую добавить так же в .SAV

Hunta
15.11.2023, 01:16
Как это (может) (будет) выглядет (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-061.jpg)
Пока ещё пристрелка, есть ошибки и не всё работает, но - дерево перекрытий слево уже не только просто демонстрация :)
Дальше - пошёл спать :)

Hunta
18.11.2023, 13:09
Переделка внутреннего механизма ссылок.

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

Поэтому (для начала) изменил сам механизм хранения ссылок, а сейчас в процессе размышления, как лучше сделать для поиска ячейки по адресу - просто поиск, естественно, есть, теперь поиск и по другим перекрытиям - но в нём есть нюансы. По дереву вниз - без проблем, а вот вверх по дереву...

Hunta
19.11.2023, 18:00
Внутренние переделки.
Внешне почти не заметно (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-062.jpg)
Изменилась взаимосвязь внутренних объектов - теперь проще будет искать по перекрытиям. По крайне мере - я так надеюсь :) Так как до поиска ячеек по перекрытиям пока не добрался - всякие внутренние переделки, эксперименты и переделки по результатам переделок..

Hunta
23.11.2023, 10:18
Продолжается зачистка ядра DisAsm-а от PDP-11 зависимостей, в первую очередь - интерфейса (графического и командной строки). Есть ещё большая зависимость в генераторе .MAC файла (в первую очередь - от .SAV), его в планах переделать (.SAV - по аналогии с .TSK), что бы он стал просто циклом прохода по всем ячейкам и вывода их содержимого в файл - примерно как оно сейчас выводится в окошках. Так что пока ничего нового...

Hunta
27.11.2023, 11:28
Наверное, самая большая переделка за последнее время.
- Переделано отображение информации об оверлеях (основное окно дизасма и окна операндов)
- Количество окон операндов теперь динамическое (если процессор не двухоперандный :) )
- Внутренние зачистки и рефакторинг

Из существенно недоделанного - столбец ссылок всё ещё расчитан на двухоперандый проц - нужен сделать по аналогии с оверлеями. Ну и генератор исходника нужно допилить по двум направлениям - избавление от PDP-11 зависимости и генерация файлов для всех оверлеев, а не только корневого :)

Как теперь выглядит окно DisAsm-11 сразу после запуска (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-063.jpg)

После открытия файла визульных изменений нет - пока не добавлю ноль-, одно- или более двух- операндный проц :)
Ну и вторая версия так и не вышла из состоянии беты - плавно перетекла в третью бету :)

- - - Добавлено - - -

Ошибся :) Столбец ссылок - это не ссылки на операнды :) Это ссылки на четный (младший) и нечётный (старший) байты текущей ячеки.. :) Ок, всё что успел надумать - в корзину :)

Hunta
29.11.2023, 23:30
Как теперь выглядит окно DisAsm-11 сразу после запуска (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-064.jpg)
Сделал столбец ссылок. Потом взгляд упал на... и я понял, что есть ещё поля для ввода меток и комментариев (четный и нечётный байты слова) :) С ними долго провозился - пока восстановил синхронизацию изменений аж в трёх местах..
Могу, конечно, опять про что-то забыть - но вроде только генератор исходника осталось переделать.

И надо бы какой-нибудь ещё проц - не двухкомандный добавить - что бы проверить - насколько работоспособны изменения (для PDP-11, понятно, проверил_

Так что сейчас определённая часть интерфейса отрисовывается, когда... есть что рисовать :)

Hunta
30.11.2023, 11:30
Уже засыпал, когда пришло в голову - как можно проверить, хотя бы визуальную часть для не двухорперандного и недвухбайтнословного процессора
Как выглядит окно DisAsm-11 для пятиоперандного трёхбайтнасловного "PDP-11" :) (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-065.jpg)
И да - несколько неудалённых зависимостей таки нашлось :)

- - - Добавлено - - -

Написал, показал, а потом неожиданно задумался - а почему только четыре окна слева :) Буду проверять - по идее, должно быть пять :)

- - - Добавлено - - -

Посмотрел исходники - ну, в принципе понятно. Константа по смыслу означала - максимальное количество операндов - а по факту - количество окон дизасма :) То есть по факту всё ок, а по смыслу.. Это исправить лехко :)

Hunta
30.11.2023, 14:05
Вот теперь правильно и по смыслу и по факту :)
Как выглядит окно DisAsm-11 для пятиоперандного трёхбайтнасловного "PDP-11" :) (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-066.jpg)

Hunta
03.12.2023, 10:55
После многочисленных перетряхиваний внутренностей DisAsm (что ещё не закончено) были сделаны подвижки и в работе с перекрытиями - начато опробование механизма работы с ссылками не только в пределах родного перекрытия, но и в другие. Механизм, который выглядит простым и логичным - ищём ячейку по адресу ещё и вниз по дереву перекрытий до корня, а так же в других корневых перекрытиях.
Первые результаты (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-067.jpg)
И вот тут я налетел на факт, что я мало знаю о многопользовательских .TSK из RSX.
Напоминание о том, что это такое - это программа, в которой компоновщик собрал две больших части - read-write секции (RW) и read-only секции (RO). И RO часть оформлена наподобие современных dll библиотек, но
- она "встроена" в программу, а не хранится отдельным файлом
- при первом запуске создается область памяти, куда грузится эта секция
- для RW секции запускаемых первого и последующих экземпляров программ для виртуального адресного пространства программы создаётся окно-отображение на эту область памяти (с доступом только на чтение!)
- эта область памяти остаётся в физической памяти до тех пор пока а) есть хоть один запущенный экземпляр программы и б) системе не требуется память для выделения чего то, а свободной памяти нужного размера нет. Причём в случае б система данную область памяти не выгружает, а просто освобождает. А как только эта RO секция опять нужна - она подгружается из .TSK файла

И вот в EDT.TSK это RO часть, если судить по данным в описании этого перекрытия (а оформляется оно как перекрытие) оказалась (значительно!) больше окна, через которое она будет отображаться :eek:



Task name : ...EDT
Partition name : GEN
Identification : V03.20
Task UIC : [1,24]
Task priority : 65.

Stack limits: 000256 001255 001000 00512.
PRG xfr address: 123470

Task attributes: CP,-FP,MU
Total address windows: 4.

Task image size : 8096. words

Task address limits: 000000 117777

R-W disk blk limits: 000002 000041 000040 00032.
R-O disk blk limits: 000042 000334 000273 00187. <--- ???? это о размещении в файле образа

......

*** Root segment: ROOT

R/W mem limits: 000000 037421 037422 16146.
R-O mem limits: 120000 172777 053000 22016. <--- размеры окна

Disk blk limits: 000002 000041 000040 00032.


Ну и поскольку обнаружилось это в процессе доработок-отладок поздно ночью - я решил - утро вечера (и ночи) мудреннее и пошёл спать :) Детектив продолжается...

- - - Добавлено - - -

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

Hunta
03.12.2023, 19:01
Вроде бы нашёл правильно число. По крайне мере - внешний вид сразу после загрузки у разных вариантов EDT похожий. Придётся лезть в исходники TKB для окончательного прояснения - что же эти числа значат...

Hunta
03.12.2023, 21:44
Первый подход к снаряду межоверлейных ссылок (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-068.jpg)
Пока проверка концепии и прояснение нюансов. Нууу... концпция вроде рабочая :) Осталось только сделать вначале оверлея список .GLOBL и.. есть мысль по поводу формата меток :)

Hunta
27.01.2024, 13:40
Ранее недописанное.

Формат межоверлейных меток в первом приближении сделан, но .GLOBAL на них ещё не выставляется - позже как-нибудь, всё равно ещё оверлеи RSX не готовы к трансляции и уже тем более к сборке программы.

По дизасму CIL и LCL файлов от DOS-11

Сам по себе парсер CIL файлов написан, теперь надо правильно проставить ссылки и выполнить первый проход анализа по модулям. Сделал модули из CIL файлов как оверлеи, где в качестве корневого модуля выступает инфа из каталога CIL файла. Первая доработка концепции оверлеев DisAsm не только под оверлеи RSX, но и под другой вариант оверлеев.

Как будет более менее приличный результат, выложу картинку :)

Hunta
27.01.2024, 17:04
Парсер вроде ОК, но вот межоверлейные ссылки.. Допиливаю :)

Hunta
27.01.2024, 21:57
CIL файл под микроскопом (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-069.jpg)

Hunta
28.01.2024, 14:19
Теперь генерятся исходники для всех оверлеев. По именам файлов ещё надо думать - для PDP11 систем это 6 или 9 символов в имени плюс 3 в расширении.


Directory of ForDebug\DisAsm\DOS11\09.20c

28.01.2024 15:16 <DIR> .
24.01.2024 19:25 <DIR> ..
11.12.1972 00:00 19 890 CILUS.LDA
24.01.2024 21:38 40 357 dump.txt
28.01.2024 15:14 1 858 MONLIB.BCL.2.MAC
28.01.2024 15:14 1 873 MONLIB.BCL.3.MAC
28.01.2024 15:14 1 879 MONLIB.BCL.4.MAC
28.01.2024 15:14 1 754 MONLIB.BCL.5.MAC
28.01.2024 15:13 14 743 MONLIB.CF.TBL.MAC
11.12.1972 00:00 89 600 MONLIB.CIL
28.01.2024 15:14 368 MONLIB.CL.L.MAC
28.01.2024 15:14 381 MONLIB.CL.P.MAC
28.01.2024 15:14 3 430 MONLIB.CTO1.MAC
28.01.2024 15:14 3 234 MONLIB.CTO2.MAC
28.01.2024 15:14 6 042 MONLIB.DV.CR0.MAC
28.01.2024 15:14 7 985 MONLIB.DV.CR1.MAC
28.01.2024 15:14 7 459 MONLIB.DV.CR2.MAC
28.01.2024 15:14 10 286 MONLIB.DV.CR3.MAC
28.01.2024 15:14 12 478 MONLIB.DV.CT.MAC
28.01.2024 15:14 1 170 MONLIB.DV.DC.MAC
28.01.2024 15:14 1 218 MONLIB.DV.DF.MAC
28.01.2024 15:14 2 083 MONLIB.DV.DK.MAC
28.01.2024 15:14 4 392 MONLIB.DV.DP.MAC
28.01.2024 15:14 4 393 MONLIB.DV.DPB.MAC
28.01.2024 15:14 2 698 MONLIB.DV.DT.MAC
28.01.2024 15:14 8 471 MONLIB.DV.KB.MAC
28.01.2024 15:14 2 701 MONLIB.DV.LP0.MAC
28.01.2024 15:14 3 243 MONLIB.DV.LP1.MAC
28.01.2024 15:14 7 771 MONLIB.DV.MT.MAC
28.01.2024 15:14 1 227 MONLIB.DV.PP.MAC
28.01.2024 15:14 1 076 MONLIB.DV.PR.MAC
28.01.2024 15:14 1 826 MONLIB.EDP.2.MAC
28.01.2024 15:14 1 787 MONLIB.EDP.3.MAC
28.01.2024 15:14 3 541 MONLIB.EM.006.MAC
28.01.2024 15:14 2 822 MONLIB.EM.007.MAC
28.01.2024 15:14 1 758 MONLIB.EM.010.MAC
28.01.2024 15:14 2 011 MONLIB.EM.011.MAC
28.01.2024 15:14 799 MONLIB.EM.012.MAC
28.01.2024 15:14 574 MONLIB.EM.013.MAC
28.01.2024 15:14 2 981 MONLIB.EM.014.MAC
28.01.2024 15:14 3 533 MONLIB.EM.015.MAC
28.01.2024 15:14 3 570 MONLIB.EM.016.MAC
28.01.2024 15:14 3 282 MONLIB.EM.017.MAC
28.01.2024 15:14 2 954 MONLIB.EM.020.MAC
28.01.2024 15:14 3 544 MONLIB.EM.021.MAC
28.01.2024 15:14 3 506 MONLIB.EM.022.MAC
28.01.2024 15:14 2 253 MONLIB.EM.024.MAC
28.01.2024 15:14 3 454 MONLIB.EM.025.MAC
28.01.2024 15:14 1 914 MONLIB.EM.031.MAC
28.01.2024 15:14 1 845 MONLIB.EM.032.MAC
28.01.2024 15:14 1 846 MONLIB.EM.033.MAC
28.01.2024 15:14 1 814 MONLIB.EM.034.MAC
28.01.2024 15:14 1 881 MONLIB.EM.035.MAC
28.01.2024 15:14 2 041 MONLIB.EM.041.MAC
28.01.2024 15:14 2 898 MONLIB.EM.042.MAC
28.01.2024 15:14 3 527 MONLIB.EM.043.MAC
28.01.2024 15:14 3 317 MONLIB.EM.044.MAC
28.01.2024 15:14 3 557 MONLIB.EM.045.MAC
28.01.2024 15:14 3 190 MONLIB.EM.046.MAC
28.01.2024 15:14 2 391 MONLIB.EM.047.MAC
28.01.2024 15:14 2 066 MONLIB.EM.050.MAC
28.01.2024 15:14 3 531 MONLIB.EM.051.MAC
28.01.2024 15:14 2 826 MONLIB.EM.052.MAC
28.01.2024 15:14 3 457 MONLIB.EM.053.MAC
28.01.2024 15:14 3 479 MONLIB.EM.054.MAC
28.01.2024 15:14 2 297 MONLIB.EM.055.MAC
28.01.2024 15:14 3 497 MONLIB.EM.056.MAC
28.01.2024 15:14 3 551 MONLIB.EM.057.MAC
28.01.2024 15:14 1 463 MONLIB.EM.060.MAC
28.01.2024 15:14 3 608 MONLIB.EM.061.MAC
28.01.2024 15:14 3 034 MONLIB.EM.062.MAC
28.01.2024 15:14 3 422 MONLIB.EM.063.MAC
28.01.2024 15:14 1 821 MONLIB.EM.064.MAC
28.01.2024 15:14 3 575 MONLIB.EM.065.MAC
28.01.2024 15:14 3 314 MONLIB.EM.066.MAC
28.01.2024 15:14 2 102 MONLIB.EM.067.MAC
28.01.2024 15:14 3 550 MONLIB.EM.071.MAC
28.01.2024 15:14 1 624 MONLIB.EM.077.MAC
28.01.2024 15:14 3 245 MONLIB.IN.001.MAC
28.01.2024 15:14 1 968 MONLIB.KB.AS.MAC
28.01.2024 15:14 1 856 MONLIB.KB.AS2.MAC
28.01.2024 15:14 1 903 MONLIB.KB.AS3.MAC
28.01.2024 15:14 1 829 MONLIB.KB.BE.MAC
28.01.2024 15:14 1 753 MONLIB.KB.BE2.MAC
28.01.2024 15:14 1 881 MONLIB.KB.BE3.MAC
28.01.2024 15:14 1 833 MONLIB.KB.BE4.MAC
28.01.2024 15:14 1 701 MONLIB.KB.DA.MAC
28.01.2024 15:14 1 850 MONLIB.KB.DA2.MAC
28.01.2024 15:14 1 806 MONLIB.KB.DA3.MAC
28.01.2024 15:14 1 858 MONLIB.KB.DA4.MAC
28.01.2024 15:14 1 877 MONLIB.KB.DU.MAC
28.01.2024 15:14 1 893 MONLIB.KB.DU2.MAC
28.01.2024 15:14 1 506 MONLIB.KB.DU3.MAC
28.01.2024 15:14 784 MONLIB.KB.DX1.MAC
28.01.2024 15:14 1 804 MONLIB.KB.EC.MAC
28.01.2024 15:14 1 603 MONLIB.KB.EO.MAC
28.01.2024 15:14 1 864 MONLIB.KB.KI.MAC
28.01.2024 15:14 1 594 MONLIB.KB.KI2.MAC
28.01.2024 15:14 1 707 MONLIB.KB.ME.MAC
28.01.2024 15:14 1 722 MONLIB.KB.MO.MAC
28.01.2024 15:14 1 942 MONLIB.KB.MO2.MAC
28.01.2024 15:14 1 681 MONLIB.KB.OD.MAC
28.01.2024 15:14 1 633 MONLIB.KB.OW.MAC
28.01.2024 15:14 1 559 MONLIB.KB.SA.MAC
28.01.2024 15:14 1 889 MONLIB.KB.SA2.MAC
28.01.2024 15:14 3 238 MONLIB.KB.SA3.MAC
28.01.2024 15:14 1 550 MONLIB.KB.TE.MAC
28.01.2024 15:14 1 856 MONLIB.KB.TF.MAC
28.01.2024 15:14 1 861 MONLIB.KB.TF2.MAC
28.01.2024 15:14 1 858 MONLIB.KB.TS.MAC
28.01.2024 15:14 1 863 MONLIB.KB.TS2.MAC
28.01.2024 15:14 1 659 MONLIB.KB.WA.MAC
28.01.2024 15:14 1 890 MONLIB.KBL.2.MAC
28.01.2024 15:14 1 813 MONLIB.KBL.3.MAC
27.05.2021 13:56 69 120 MONLIB.LCL
28.01.2024 15:14 3 598 MONLIB.LD.001.MAC
28.01.2024 15:14 3 433 MONLIB.LD.002.MAC
28.01.2024 15:08 24 063 MONLIB.MAC
28.01.2024 15:14 3 238 MONLIB.OPN1.MAC
28.01.2024 15:12 55 238 MONLIB.RM.001.MAC
28.01.2024 15:14 49 097 MONLIB.TM..MAC
27.05.2021 13:56 15 360 SYSLOD.CIL
27.05.2021 13:56 13 312 SYSMAC.SML
121 File(s) 693 281 bytes
2 Dir(s) 39 142 969 344 bytes free


Проверки пока идут с CIL файлами :)

Hunta
19.03.2024, 09:50
Здравствуйте вы закончили disasm можно его попросить на пробу?
Лучше, конечно, писать в правильной теме :)
Теперь по вопросам.

Все мои программы разрабатываются, в первую очередь, под мои хотелки. А поскольку хотелки часто обширны - реализовать их с подходом - сели и написали - крайне тяжело. Часто нужно долго курить документацию (и не только на PDP-11), отлаживать ошибки и подход в целом, а так же - хотелки со временем и опытом (могут и) меняются. Поэтому ответ на вопрос "вы закончили?" в отношении любой моей поделки с вероятностью под 100 процентов - нет, в процессе :)

Что касается DisAsm. Была начата доработка для работы с одним из вариантов программ с оверлеями DOS-11, но попутно были изменения во внутренностях пользовательского интерфейса и на текущий момент он несколько СЛОМАН - не работают клавиши-команды типа C, D, Z, а так же ввод символов таких клавиш в комментариях.

Плюс - DisAsm и ImageUtils используют приличное количество общего кода, а в процессе добавления функционала в DisAsm мне понадобилась возможность переносить файлы с PC в DOS-11, поэтому на определённом этапе доработок DisAsm я переключился на ImageUtils (где пока и нахожусь). Так что, возможно, что в DisAsm не работает что-то ещё.

Когда вернусь к DisAsm для доработок и фиксов - НЕ ПРЕДСКАЗУЕМО - так как свободного времени на хобби очень мало.

Так что

- если требуется функционал дизасма образов памяти (ака ПЗУ) или SAV файлов - ничего нового нет, можно использовать старую версию. Могу выложить последний вариант (до переделок) с рабочего компа, но это вариант, который использует .NET 7, то есть нужна Windows, которая его поддерживает и нужно устнановить на неё поддержку .NET 7

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

Hunta
20.04.2024, 14:39
Руки наконец дошли до DisAsm, а точнее - до сломанных клавиш-команд. После гугления и экспериментов стала более-менее понятно, что сломалось (ответ - что-то недоделанное (возможно) в .NET) и даже сумел прилепить костыль, что бы заработало. Из оставшегося неработающего - enter и esc в полях ввода комменатриев, но скорее всего - причина понятна. Пока тестирую остальные команды, как доберусь до enter/esc - посмотрю, прав ли.

- - - Добавлено - - -

Ну, вроде привязку шот-катов пофиксил. Опять возвращаюсь к DOS-11 :)

Hunta
21.09.2024, 14:44
Как ни странно, но в процессе перерыва занимался не программированием в другом виде (ака FPGA), а некоторым наведением порядка на компе. Ну и последние где-то четыре дня в процессе засыпания в голове крутилась одна мысль. Которую я рассматривал с разных сторон, пока, наконец, мысль не созрела :)

Это предыстория :) Дальше история :)

В какой-то момент в DisAsm были добавлены служебные ячейки, которые позволили описывать разное - не только команды и метки (которые генерятся из дизассемблируемого файла), а всякие .TITLE, .IDENT. Ну и блочные комменты - они из той же серии. Это позволило приблизить генерируемый файл в нормальному исходнику, но создало некоторые проблемы - когда нужно было, скажем - из команды, сослаться на другую ячейку - с командой или данными. Для чего её сначала нужно было найти. Раньше было просто - все ячейки с данными из файла - простой массив, который содержал только их - и по адресу, связанному с ячейкой, можно было просто вычислить её индекс в массиве и выйти на неё. Быстро.

Но теперь среди ячеек мало того, что встречаются служебные (без адреса и/или данных) - так ещё и они добавляются-удаляются на ходу (чего не происходит с ячейками из файла). Соотвественно - найти уже так просто не получается.

Технически - это не мешало процессу дизасма, а только замедляло поиск нужной ячейки и на какое-то (долгое) время я на это забил.

Но это не значит, что мне это нравилось :)

Вот собственно - на эту тему мысли в голове и крутились :) И с четверга на пятницу (возможное) решение - как ускорить поиск - вызрело. До состояния, в котором я уже не видел с ходу проблем с его реализацией и использование.

В общем, в пятницу вечером набросал и слегка проверил, а сегодня допроверял и дофиксил. Не скажу, что все ошибки нашёл и пофиксил, но, по крайне мере, при запуске некоторого количества автоматических тестов DisAsm бодро отрабатывает, не валится, и результаты вроде ок :)

Ессссвенно, было интересно - ускорилось и если на да - насколько. Поэтому один из автоматических тестов (дизасм EDT.TSK) был переделан под оценку времени.

Результаты

Старый вариант - 21 секунда
Новый варант (debug) - 24 секунд
Новый варант (release) - 14 секунд

ОЧЕНЬ прилично получилось :)

Ну и видно - насколько медленней вариант debug по сравнению с release :)

Ну а суть алгоритма ускорения - некий вариант кэширования :) То есть - памяти тратится побольше (но "кэш-память" - это простой массив, так что - не сильно много), а работаем побыстрее :)

Тестирование, фиксы ошибк (если найдутся) и доработка продолжается :)
Пока опять не устану от программирования - ибо на работе его никто не отменял

Hunta
22.09.2024, 00:38
Давнишний недоделанный остаток переноса всего зависимого от чего-то кода в спец модули - в генераторе исходника был код под .SAV файлы. Выпилил и перенёс. Теперь вроде такого кода не осталось. Теоретически - можно добавлять другие процессора :) Но пока не до этого :)

- - - Добавлено - - -

И заголовок .SAV пока парсится руками, а не по описанию классом. Вариант, который сейчас обрабатывает DisAsm - простейший (даже оверлеи пока не парсятся), так что пока не стал заморачиваться на создание описания классом. Как-нибудь, скорее всего, когда начну добавлять работу с оверлеями

Hunta
23.09.2024, 00:57
В процессе тестирования поправил две ошибки.

Одна была известна - если в DisAsm-е открыть файл, а потом, не выходя из него, открыть другой файл - он показывал странное. Оказалось - думал на не то место возникновения. Поправил

Вторая - новая. Оказалось, в процесс доработок сломал сохранение сеанс. Пришлось попотеть над одним моментом, но - тоже поправил.

Hunta
24.09.2024, 09:49
Пока причёсываю код.
Из мысле, которые в голову - добавить дизасм .OBJ файлов. Но перед этим надо продумать некоторое количество доработок :)

- - - Добавлено - - -

Ещё из мысле. MS слегка выпилила поддержку КОИ-8 из стандартной поставки для .NET 5.x-.., что привело к тому, что DisAsm11X таскает за собой .dll на 700+ кб. Что мне несколько не нравится. Поэтому обдумываю вариант - впилить поддержку КОИ-8 непосредственно в DisAsm.

Ну а в КОИ-8 генерируются всякие текстовые .ASCII

Hunta
28.09.2024, 15:59
Поставил давно хотимый эксперимент.

Вводная часть.

Сейчас для программ с тем или иным вариантом оверлеев DisAsm создает по три визуализирующих объекта (основное окна дизасма и два окна операндов) на каждый оверлей (или его аналог). Цена - загружается дольше. Ну и, скажем - изменение размеров окна самого DisAsm-а - тоже не быстрая операция. Если, конечно, оверлеев МНОГО :) Плюсы - окна между оверлеями переключаются очень быстро.

Эксперимент.

Ставился на MONLIB.CIL (файл библиотеки операционки DOS-11) - там 117 модулей - ядро и модули-оверлеи.

Сделал вариант, когда визуализирующих объектов всего три - и к ним динамически цепляются массивы ячеек - при переключении между оверлеями или когда аргумент(ы) команды - в других модулях

Итак. Первым указывается время работы первого ("многооконного") варианта DisAsm, а вторым - тестируемый "трёх-оконный" вариант

Время загрузки - 74 секунды против 3 секунд
Размер программы после загрузки - 2.1 Гб против 195 мб
Генерация исходников - 98 секунд против 4 секунд
Размер программы после генерации исходников - 2.9 Гб против 195 мб
Переключение между модулям - практически моментально против около секунды

Комментарий по поводу времени генрации исходников - когда писал код, у меня возникла мысль, что перед генерацией надо вырубить визуализацию, а после - включить - в силу происходящих в процессе генерации вещей показалось, что так будет быстрее. Но, похоже - оказалось показалось. Поэтому был поставлен ещё один эксперимент - не вырубать визуализацию. Время генерации стало 4 секунды :)

В общем, похоже оставлю новый вариант :)

Hunta
29.09.2024, 22:51
Война с процессом восстановления текущего оверлея и текущих ячеек в нём при открытии файла сохранённой сессии.

Точнее говоря - с действиями, что бы в приложении после восстановления сохранённой сессии вернуть их, в силу некоторых особенностей WPF и .NET.

Но вроде бы победил. В целом. :)

Hunta
03.11.2024, 14:51
В процессе доработки ImageUtils периодически отвлекаюсь на разное, в частности, на дизасм. И вот, возясь с очередным, понял, что не хватает мне НЕКОЕГО функционала :) Итак

Запускаем DisAsm11, открываем файл (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-073.jpg)

Нажимаем Ctrl/C (видимого результата нет)

Переходим на другую ячейку (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-074.jpg)

Нажимаем F7, а затем Ctrl/C (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-075.jpg)

А затем - искать далее и - вуаля! (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-076.jpg)

Пока ограничился таким - как обычно - надо поиграться и понять - что не так сделал и чего не хватает :)

- - - Добавлено - - -

А, да, вдогонку. Работают также Shift/F7 (продолжить поиск вперёд) и Alt/F7 (продолжить поиск назад). Ctrl/F7 (поиск с заменой) не используется.

Woxem
03.11.2024, 19:24
Можно ссылку и на disasm?

Hunta
03.11.2024, 21:11
DisAsm более менее работоспособен (по крайне мере на ошибки пока не налетал), так что да, чуть позже только

Hunta
04.11.2024, 00:21
Подчистил некоторое количество хвостов - в плане ошибок, неточностей и неудобств. Не все, но, скорее всего, на этом пока остановлюсь (если ошибок опять не найду).

Очень удобно, что стало возможным искать разное :)

Поиск сделан достаточно дубово. Берётся содержимое пятого столбца окна дизасма. Что туда попадёт - можно посмотреть, сделав Ctrl/C и вставив текст куда угодно, хоть в Notepad. Далее - табуляции заменяются на пробел, выкидываются переходы на новую строку, а последовательности пробелов заменяются на один. Получившаяся строка ищется от следующей ячейки (если поиск вперёд) или предыдущей (поиск назад) и до последней/первой ячейки, с содержимом которых повторяется та же операции и результат проверяется на наличии строки поиска как подстроки. То есть - если есть метки - можно искать метку, если есть комментарии - можно искать в комментариях, но по любой части команды (только принимая во внимание, что после запятой, разделяющей операнды - идёт пробел. Ну и любые комбинации. Если очередная ячейка найдена - становится текущей, если не найдена - текущая не меняется.

Никаких вариантов а ля * (любое количество любых символов) или ? (один любой символ). Если и буду делать - как-нибудь, если понадобится.

А вообще странно - чего я давно не сделал поиск :)

Hunta
11.11.2024, 00:43
Как уже написал в топике про ImageUtils - устал от него и (подтолкнула текущая возня с дизасмом одной проги) продолжил доработку DisAsm-11. Про добавленный поиск уже написал, но на нём не остановился.

Когда-то достаточно давно в DisAsm-11 было добавлено определение макровызовов, которые, ко всему прочему, генерировались в зависимости от операционки для программы. Технически - всё работало, но было два Но. Одно Но было не очень так чтобы Но, скорее - но, но... Неудобно было. Это было Но - но вызвать с клавиатуры или интерфейса распознание макровызова было не возможно. Поэтому было встроен механизм - если идёт анализ кода (при загрузке или по кнопке C) - то идёт попытка и распознать макровызовы. Так что - не сильно не удобно, но.. не удобно :)

Второе Но, даже НО - добавление новых макровызовов в процесс определения было КРАЙНЕ НЕДОБНО сделано. Нужно было добавить объекты-описания на уровне исходников. То есть захотел ещё один макро - редактируй исходники. Но, по ряду причин, было сделано как сделано и в принципе - неплохо работало.

Занялся я дизасмом одной проги под RSX - а для RSX никаких описаний не было. Можно было пойти по старому, проверенному пути, но в голове начала-продолжила крутится мысль об изменения механизма и источника данных для определения макровызово. А в силу некоторых изменений внутри DisAsm-а - стало возможным изменить структуру описания шаблонов для поиска макровызовов и в результате - вынести их из DisAsm-а.

В общем, где-то примерно со среды началась доработка. Сегодня наконец стали появляться визуальные результаты :) Пока всё ещё концепт, но уже неплохо работающий концепт.

Как выглядит на текущий момент.

Загружаем в DisAsm программу (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-077.jpg)

Обращаю внимание, что в левом окне текущая ячейка - начало последовательности макровызова, а в правом верхнем - блок, описывающий макровызов, на который ссылается последовательность из левого окна

Жмём Alt/M и... (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-078.jpg)

Получаем макровызов в левом окне и подстановку-определение блока макровызова в правом верхнем

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

Вот тут мне RSX подкинула бяку :) На картинке - неправильное обращение к макросу QIO$, правильно должно быть так:


QIO$ 2440, 15, 15, K00442, 0, <L21640, 2, 0, 0, 0, 0>

или даже так можно


QIO$ 2440, 15, 15, K00442, 0, <L21640, 2>

Но это ещё предстоит допилить :)

Как выглядит описание шаблонов на текущий момент:


DIR$ ; source operand from instruction ; srcarg
012746 srcarg
[MCallPointer] 000000:000001
104377

QIO$ srcArg1, srcArg2, srcArg3, srcArg4, srcArg5, srcIO1, srcIO2, srcIO3, srcIO4, srcIO5, srcIO6
[byte] 001 ; dic
[byte] 014:377 ; dpb size
0:0 srcArg1 ; function
0:0 srcArg2 ; lun
[byte] 0:0 srcArg3 ; efn
[byte] 0:0
[DPointer] 0:0 srcArg4 ; iost pointer
[CPointer] 0:0 srcArg5 ; ast pointer
[DPointer] 0:0 srcIO1
0:0 srcIO2
0:0 srcIO3
0:0 srcIO4
0:0 srcIO5
0:0 srcIO6

QIOW$ srcArg1, srcArg2, srcArg3, srcArg4, srcArg5, srcIO1, srcIO2, srcIO3, srcIO4, srcIO5, srcIO6
[byte] 003 ; dic
[byte] 014:377 ; dpb size
0:0 srcArg1 ; function
0:0 srcArg2 ; lun
[byte] 0:0 srcArg3 ; efn
[byte] 0:0
[DPointer] 0:0 srcArg4 ; iost pointer
[CPointer] 0:0 srcArg5 ; ast pointer
[DPointer] 0:0 srcIO1
0:0 srcIO2
0:0 srcIO3
0:0 srcIO4
0:0 srcIO5
0:0 srcIO6

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

Из неавтоматических плюсов - в шаблоне можно указать тип ссылки (скажем, для DIR$ - что она ссылается на блок-описания макроса - MCallPointer) - и для ячейки автоматом выставится нужный тип, что так же может привести к цепочке последствия - скажем, в случае того же DIR$ автоматом будет попытка определения макроса в блоке-описании, что и можно наблюдать на картинках.

Ещё изменения в работа с шаблонами - теперь можно описать несколько шаблонов - в зависимости от процессора, операционки, типа файла и т.п., а так же можно описать шаблон под дизасм конкретной программы - приведенный выше шаблон сейчас сделан как раз в таком сценарии. Причём, если исходник шаблона был изменён - при попытке обратится к Alt/M DisAsm-11 это увидет - и подгрузит новый вариант.

Что ещё в планах

Изменение принципа работы с шаблонами

Для шаблонов из каталога, где лежит DisAsm11.exe - в начале дизасм-а они будут подгружаться в сеанс и дальше их изменения на текущем дизасме отражаться не будут

Для шаблонов, связанных с дизассемблированной программы - изменения будут определяться, сгенерированные обращения для шаблонов, которые были удалены или изменены - будут аннулироваться, но после подгрузки новых - для ранее сгенерированных обращений будет повторяться поиск шаблона

Возможно (!! пока ешё не определился) будут добавлны также шаблоны уровня каталога - то есть если в каталоге лежит несколько дизассемблируемых программ - для них можно будет создать общие шаблоны. Но пока ценность такого не понятна.

Так же есть мысль добавить возможно переносить комментарии из шаблона в дизасм. Тут вроде всё должно быть не сильно сложно.

Практически наверняка будут ещё аттрибуты (типа MCallPointer) уровня шаблона и уровня заголовка-описания (там, где DIR$) шаблона - но они добавляются из практической необходимости, делать по сценарию - а давайте добавим ещё такой, такой и сякой аттрибут, просто что бы было - не буду :)

Так же теперь появляется возможность описывать не только макровызовы, но и определять всякие стандартные процедуры, скажем - те, которые в SYSLIB. Думаю. Механизм в целом будет похож на работы с макросыми, но есть (в визуализации) существенные отличия. Так что тут пока вообще никак :)

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

Hunta
12.11.2024, 15:26
Из реализованного (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-079.jpg)
Для QIOW$ - проверка алгоритма, а не реальная структура макро-вызова :)
Как выглядит шаблон:


QIO$ srcArg1, srcArg2, srcArg3, srcArg4, srcArg5, <srcIO1, srcIO2, srcIO3, srcIO4, srcIO5, srcIO6>
[byte] 001 ; dic
[byte] 014:377 ; dpb size
0:0 srcArg1 ; function
0:0 srcArg2 ; lun
[byte] 0:0 srcArg3 ; efn
[byte] 0:0
[DPointer] 0:0 srcArg4 ; iost pointer
[CPointer] 0:0 srcArg5 ; ast pointer
[DPointer] 0:0 srcIO1
0:0 srcIO2
0:0 srcIO3
0:0 srcIO4
0:0 srcIO5
0:0 srcIO6

QIOW$ srcArg1, srcArg2, srcArg3, <<srcArg4>>, <srcArg5>, <<srcIO1, srcIO2>, <srcIO3, srcIO4>, srcIO5, srcIO6>
[byte] 003 ; dic
[byte] 014:377 ; dpb size
0:0 srcArg1 ; function
0:0 srcArg2 ; lun
[byte] 0:0 srcArg3 ; efn
[byte] 0:0
[DPointer] 0:0 srcArg4 ; iost pointer
[CPointer] 0:0 srcArg5 ; ast pointer
[DPointer] 0:0 srcIO1
0:0 srcIO2
0:0 srcIO3
0:0 srcIO4
0:0 srcIO5
0:0 srcIO6


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

Hunta
13.11.2024, 14:56
Ну, технически это не что-то новое, в старом варианте что-то (похожее) было, но в новом реализовано по другому.

Как это выглядит на картинке (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-080.jpg)

И в шаблоне



MRKT$S srcEF, srcTM, srcTU, srcAST
01xx46 srcEF | 005046
01xx46 srcTM | 005046
01xx46 srcTU | 005046
01xx46 srcAST | 005046
012746
[byte] 27 ; dic
[byte] 5 ; dpb size
104377

Варианты для команд из макросов я добавил в самом начале этой доработки, но вот проверка на совпадение с шаблоном и подготовка данных для визуализациии - потребовали некоторого количества кода. Сама визуализация отработала сразу :)

Развлечения продолжаются... :)

- - - Добавлено - - -

Глядя на картинку выше - так и хочется всё это дело описывать и мнемониками команд, но.. к такому подвигу пока не готов :)

Возможно(!) - для стандартных процедур и кусков кода сделаю что-то промежуточное - будет браться листинг и допиливаться под шаблон с сохранением какой-то информации, но... пока не думал на эту тему

Hunta
13.11.2024, 17:09
Приведённой выше картинки и шаблону не верить - сразу две ошибки - в шаблонке и в обрабатывающем коде :)
Правильно должно быть так:


N14576:
MRKT$S #30, R0, #2


:)

Hunta
13.11.2024, 20:10
Набросал несколько макросов, исправил несколько ошибок :) (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-081.jpg)

- - - Добавлено - - -

В целом - я не знаю, сколько бы описывал эти три макроса при старом подходе.
При новом (если не считать посаженные ошибки) на шаблон макроса уходит меньше минуты :)

Hunta
13.11.2024, 23:37
19 макросов. Копирую исходник из RSXMAC.SML, дальше беру как образец уже описанный макрос и подрихтую его под новый.

Основное время уходит на проверку результата, так как механизм ещё отлаживается и пока никаких сообщений - что не понравилось в шаблонах :) Или загрузит новые или нет. Или найдёт подходящий или нет :)

- - - Добавлено - - -

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

Так что попробую добавить отслеживание изменений шаблонов (тех, которые были использованы для генерации макровызово) и автоматическое сначала аннулирование, а затем повторный поиск.

Ну и продолжу добавлять новые шаблоны.

Hunta
14.11.2024, 10:11
Немного в сторону - некоторые разборки с git - хочу всю ветку, сделанную для проверки нового подхода, перенести в master. Был бы один коммит - вообще не вопрос, а тут несколько и хочу все сохранить. Не сильно большой спец по git, поэтому займёт некоторое время :)

Hunta
14.11.2024, 13:47
Оказалось, сделать просто - но из командной строки :)

Продолжил развлекаться с шаблонами и дальнейшей разработкой :)

Hunta
17.11.2024, 16:46
Некоторое уточнения. Для ускорения процесса, текстовый шаблон-описание макровызовов DisAsm при загрузке преобразует во внутренее представление и сохраняет в двоичном виде. В дальнейшем, если текстовый файл не менялся - определения загружаются из двоичного файла, а если изменился - двоичный пересоздаётся.

На текущий момент

- добавлены общие (в каталоге с DisAsm11.exe) шаблоны, которые подгружаются (в соотвествии с процессором, операционкой, типом и субтипом файла) при открытии программы на дизасм. Их измененение DisAsm не отслеживает и в будущем предполагается, что конечным пользователям на изменение они доступны не будут.

- шаблоны для дизассемблируемой программы подгружаются динамически - при загружке программы на дизасм DisAsm11 подгружает их, если находит, а при использовании команды AltM или кнопки "Макрокоманда?" подгружает (если раньше не было) или обновляет определения (исходный файл изменился), причём, если какие-то макросы из старого определения были использованы - они аннулируются и вновь запускается процесс определения. Так что если по шаблону блок кода подходит - DisAsm покажет новый вариант макровызова.

- код старого авто-определения макровызовов выпилен (то есть сейчас после загрузки программы на дизасм никаких макровызовов), а (программное) описание шаблонов будет переносится в файлы-описания и тоже выпиливаться

- в связи с тем, что поставляемые с DisAsm-ом описания шаблонов будут закрыты на изменения (текстовые исходники будут доступны), скорее всего будет так же добавлена поддержка шаблонов уровня пользователя - которые будут подгружаться при загрузки программы. Будет ли или нет отслеживание изменения исходных файлов этих шаблонов - скорее всего да, но пока не обдумывал.

Порядок загрузки шаблонов

Пользовательский шаблон уровня программы
Системный шаблон для субтипа файла
Системный шаблон для типа файла
Системный шаблон для операционки
Системный шаблон для процессора

Шаблоны ищутся в порядке загрузки - никакой сортировки или проверки на совпадение имен - это позволяет описать для макроса несколько вариантов шаблонов

Hunta
17.11.2024, 23:45
Ахренеть, как удобно :)
Нашёл очередной вызов (CtrlF в помощь), AltM.
Если распознался - ищем дальше
Если нет - посмотрел в RSXMAC.SML, добавил описание в файл шаблонов, AltM, ищем дальше :)
На добавление очердного описания макровызова - меньше минуты :)

- - - Добавлено - - -

Вроде по шаблонам макро-вызовов сделал всё, что было в планах. Ну, может чего забыл или придёт в голову - тогда добавлю.

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

Тестирование и рефакторинг :)

- - - Добавлено - - -

Вдогонку. На то, что бы в дизассемблируемой сейчас программе найти все макро-вызовы и добавить ещё не описанные шаблоны (порядка 10, я добавлял парами - $ и $S формы) - ушло примерно полчаса

Hunta
18.11.2024, 10:49
Поправил пару ошибк.

Сценарий первой - файл сессии был создан, когда в каталоге в DisAsm11.exe шаблонов под программу не было. А при очередном восстановлении они уже были. Решил, что лучше сделать вариант, когда они (однократно) подгрузятся. Но этот сценарий навёл на мысли, что работу с системными шаблонами надо ещё продумать.

Сценарий второй - я отрабатывал работу с шаблонами на файле сессии (в том числе, хакая его под VS по мере изменения объектов :) ), но вот проверить - а как DisAsm загрузить файл программы - как-то не проверил :) Оказалось (из-за некоторых изменений), что НИКАК :) Поправил.

Ну и пришла в голову мысль, что есть ОС (типа CAPS-11), где вообще или в ранних версиях - ассемблер был ни разу не Macro :) Пока вариант - добавить для этого сценария флаг в описание макроса, что бы всё выглядело как работа с макросом, но комментировались не команды, входящие в макрос, а сам "вызов" макроса, а к командам, скажем, добавлялись комментарии :)

Hunta
18.11.2024, 21:12
Для систем, где ассемблер не поддерживает макросы - раз (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-082.jpg) -> два (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-083.jpg)

Тестирование и фикс некоторых шерховатостей.
Ну и более внятные сообщения об ошибках в шаблонах :)

- - - Добавлено - - -

А, да - перенос старого варианта шаблонов :) Ну и в процессе может что вылезет или обнаружится :)

Hunta
19.11.2024, 00:06
Ещё пример, как это может выглядить для операционок и ассемблеров, не поддерживающих макросы
CAPS-11's PIP (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-084.jpg)

BlaireCas
19.11.2024, 11:34
Товарищу Хунте выносится благодарность за дизассемблер. С его помощью удалось дизассемблировать тетрис для RT-11 (и в дальнейшем успешно скомпилировать).
У меня конечно старая версия и возможно уже исправлено, но вообщем замечания/предложения:

1) Не всегда пишет перевод в макрос например .print. Пример:

START:
MOV #4747, R0
EMT 351
.PRINT #4574
; MOV #4574, R0
; EMT 351

Второй emt подправило на .print, первый оставило как есть. Видимо из-за нечетного адреса.

2) Было-бы круто расставлять на такие вещи метки сразу. Пришлось прилично потыкать руками в подобные адреса превращая их в метки. Ну то-есть если и так превратило в .print - то тут наверняка лучше метку поставить.

3) Переводы данных в .ascii .. В принципе работает. Что бы было круто для удобства - когда жмешь на ascii high byte допустим - туда бы метку проставляло ну вида А12345: .. как бы тут сказать. Вообщем есть произвольный адрес (четный или нечетный). Хочется его выбрать и чтобы там была метка и затем шли байты ascii

Hunta
19.11.2024, 12:55
По 1 - идёт работа. Поскольку в отданном варианте - старый вариант работы с макросами - даже проверять не буду. Но если бросишь ссылку - откуда этот тетрис можно скачать - посмотрю на новом варианте - что вылезет. Ну и по идее - в данном варианте не должно блокировать нечётный адрес, но.. мог и неправильно описать (старый) шаблон :)

По 2 - в новых шаблонах адрес СРАЗУ превратится в метку :) Такая возможность в шаблоны заложена (самому лень дополнительно тыкать)

По 3 - пока это (.ASCII) несколько больная тема :) Работаю над ней - периодически. По поводу меток - они ставятся (в том числе и на нечётные адреса) - если есть ссылка. Есть ссылка на младший байт (или всё слово) - будет метка, есть ссылка на старший байт - будет ссылка :)

- - - Добавлено - - -

Вдогонку по третьему - если в середине строки .ASCII появляется ссылка - строка режется в месте ссылки. Ну и я ещё часто пользуюсь тем (для удобной визуализации), что если где-то в середине длинной строки тыкнуть "Ascii Low Byte" или "Ascii High Byte" - строка в этом месте разрежется

- - - Добавлено - - -

Как бы подводя итог - сейчас идёт работа надо новым механизмом нахождения и визуализации макро-вызовов, практически всё задуманное вначале - реализовано, сейчас идёт этап тестирования-отладки-исправления и параллельно - перевод старых описания макросов (много было сделано под DOS-11 и RT-11) в новые шаблоны. С 9.12 я в отпуске - и интенсивность процесса возрастёт. И просить текущий вариант я бы не советовал :)

BlaireCas
19.11.2024, 16:51
Но если бросишь ссылку - откуда этот тетрис можно скачать - посмотрю на новом варианте - что вылезет.
Вот есть набор игр под какой-то (vt52?) из терминалов RT-11: https://ia904500.us.archive.org/11/items/RT-11_Games/games.dsk
Конкретно дизассемблировал самую маленькую TET2.SAV (некий вариант тетрис-пентикса).

Hunta
19.11.2024, 19:27
Вот есть набор игр
Аха, спасибо. Правда, не сильно обещаю, что на неделе посмотрю на этот тетрис, скорее всего - в выходные.
Пока опять воюю с одной старой проблемой в DisAsm, которая периодически мне на нервы действует :)

Hunta
20.11.2024, 13:10
Вроде проблему победил (наверное и в очередной раз), так что теперь поразвлекаюсь с TET2.SAV - с прицелом на перенос макросов RT11

- - - Добавлено - - -


первый оставило как есть. Видимо из-за нечетного адреса.
Сложно сказать, как оно было (и смысла проверять нет), но скорее всего - действительно косяк был.

В новом, кстати, тоже сначала - макрос распознался, а то что аргумент - указатель - нет. Поправил возможность указывать для указателя на данные - байтовый или словный :)

И этот сценарий, кстати, навёл на мысль, что неплохо так же иметь возможность указать, что указатель указывает на строку .ASCIZ :) Надо будет допилить - ибо удобно :)

- - - Добавлено - - -

Не вытерпел :) Теперь - одним движением пальцев на AltM..
Ну ладно ладно - тремя AltM и четырьмя стрелками вниз брюки превращаются (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-085.jpg) ... :)

Как выглядит шаблон



.PRINT srcAddr
[BPointer, AsciZ] 01XX00 srcAddr ; Address
104351


Пока это первый и единственный макрос :) Остальные буду переносить по мере нахождения в .SAV (что бы сразу проверять :) )

- - - Добавлено - - -


Ахренеть, как удобно
Сам тащусь!! :v2_dizzy_heart:

- - - Добавлено - - -

В общем...

пункт первый - готов

пункт второй - готов+

пункт третий - как я уже сказал - если есть ссылка - метка будет сделана автоматом. Если нет ссылки - как вариант - можно прописать самому метку.

И напоминаю - на ячейку, для которой DisAsm генерит метку автоматом (есть ссылка(и)) - можно прописать и свою метку - тогда будет использована она. Ручные метки можно ставить где угодно и удалять откуда угодно. Если ручную метку удалить, но на ячейку есть ссылка(и) - DisAsm поставит автоматическую метку

И ещё - для ручных меток НЕТ ПРОВЕРКИ на повторное использование :) Периодически подумываю, но пока нет :)

- - - Добавлено - - -

Загрузился, поискал EMT, в найденных ткнул AltM и сгенерил исходник
Результат (http://www.kpxx.ru/Soft/Utils/DisAsm11/TET2.MAC)
Результат не проверялся ни взглядом, ни компиляцией-сборкой-сравнением с оригиналом :) Так сказать - девственно-чистый-от-DisAsm11 :)

На беглый взгляд (в процессе) была замечана только одна ошибка - когда ссылка вела внутрь макро-расширения. Про этот сценарий мне известно, в процессе решения :)

Позже (скорее всего сегодня вечером) попробую скопмилить-собрать. О результатах напишу :)

BlaireCas
20.11.2024, 13:16
Загрузился, поискал EMT, в найденных ткнул AltM и сгенерил исходник
Результат
Данный вариант получился уже очень хорошо на вид. Проставлены метки, аски стали аски (а то были ворды).

Тем не менее вот тут имхо бага (лишний комментарий получился, movb нужен всеж):
M03214:
.TTYIN K03300
;M03214:
; EMT 340
; BCS M03214
; MOVB R0, K03300

CMPB R0, #60

Должно быть так (в старом варианте дизасма верно):
M03214:
.TTINR
;M03214:
; EMT 340
BCS M03214
MOVB R0, K03300

CMPB R0, #60

Hunta
20.11.2024, 14:29
Фигню написал, не заметил что поменялось с ttyinr на ttyin
Ну там вроде всё ок на беглый взгляд :) Но сам проверять буду позже, может - в обед (через полчаса) получится что-то прогнать успеть :)

- - - Добавлено - - -

Есть ещё пара-тройка болячек и, возможно, что-то будет вылезать при переносе и описании новых макрошаблонов :)

Пока тестирую...

- - - Добавлено - - -


в старом варианте дизасм
Там были описаны только варианты .TTINR и .TTOUT - поэтому там так :)

А, да, пока работает только ручной режим определения макросов, надо подумать - как лучше сделать автоматический, как в старом :)

- - - Добавлено - - -

И ещё - старый вариант я тестировал по сценарию - берем некую прогу, дизссемблируем, а потом результат проверяем - трансляция-сборка-автоматическое дизассемблирование и сравнение с результатм автоматического дизассемблирования исходного файла. Для некоторых файлов (.SAV например) - можно было сравнивать и бинарники, но .LDA формат так не получалось - блоки (из которых он состоит) могли быть разной длины от разных версий ассемблера и линкера - вот для это и делалось ещё автодизассемблирование

- - - Добавлено - - -

А потом я занялся .TSK от RSX, а там до возможности сразу транслировать и собирать пока далековато, особенно если программа с оверлеями (это, кстати и RT-11 касается, но для неё я разборку оверлеев ещё не делал). Да и если простая программа - тоже командник для сборщика может понадобиться. Плюс - результат дизасма ещё надо в RSX перенести - варианты есть, но такого, как для RT-11 и эмулятора Патрона - увы... Поэтому и не проверял ничего по такому сценарию - нечего было проверять :)

А вот сейчас (точнее говоря - скорее всего в отпуск) - опять начну автотесты гонять :)

- - - Добавлено - - -

Проверил.
Порядка 7 ошибок, большая часть из которых - проблемы с генерацией меток.
Ну и одна странная ошибка - задублировалась строка .ASCIZ :)

BlaireCas
20.11.2024, 14:39
На беглый взгляд (в процессе) была замечана только одна ошибка - когда ссылка вела внутрь макро-расширения. Про этот сценарий мне известно, в процессе решения
Это хорошо. А то такое да, случается сейчас. Навроде:

MOV #K02515, R0

ASR R5
BCC M01054
.PRINT #K02607
; MOV #K02607, R0

;M01054:
; EMT 351
RETURN

Hunta
20.11.2024, 15:08
Проверил. По уточнённым данным - четыре ошибки.
1. Метка в середине макро-расширения (известно, пока не решил)
2. Метка на один из операндов. Генерируется правильная метка и, почему то, ещё одна за командой (по идее - её не должно быть)
-- Две штуки
-- На ближайшие проверку-исправление
3. Неправильная генерация в сценарии - есть .ASCII, а перед ней байт, на который ссылается .PRINT
-- На ближайшие проверку-исправление
4. Срезалось слово в конце программы :)
-- Моя старая борьба о том - что такое диапазон адресов 0..776 (и похожий 0..777) - последний адрес слова или байта - это последний занятый или первый свободный :) Похоже для .SAV промахнулся
-- На ближайшие проверку-исправление

- - - Добавлено - - -

А, да, после фикса ошибок (не совсем очевидно было для 3, я и посчитал, что 7) и сборки - один в один :)

- - - Добавлено - - -

Результат (http://www.kpxx.ru/Soft/Utils/DisAsm11/TET2.Fixed.MAC)

Hunta
20.11.2024, 21:42
Пункт 2. Нууу... Видимо 5-ого ноября между 10:30 и 16:13 я был... э... пьян :) Потому как именно в этот промежуток я сделал одно мееееееееелкое изменение - и вылезла ошибка пункта 2. Вроде поправил.

Пункт 3. Очередная попытка доработать AsciZ. Вроде теперь правильно генерит

Пункт 4. Поправил

Немного позже сгенерю .MAC по тому же сценарию (пройтись по EMT и сделать макросы) и посмотрю - шо будет :)

- - - Добавлено - - -

Проверил - осталась ровно одна ошибка - пункт 1 :)

Hunta
21.11.2024, 10:17
Прошёлся по всем командам - вызовы кнопками или шоткатами - проверил, что бы после команды фокус ввода возвращался на следующию ячейку после последней, попавшей под действие команды. Вроде бы эпопея с выставлением фокуса ввода в списках закончилась.

На текущий момент.

- в макросах предстоит проработать вопрос генерации меток, которые внутри макроса
- в визуалиазции макросов добавить показ комментария, который написал на макрос
- для макросов (и аналогичных ячеек) заблокировать комментарии на старший байт :)
- проверить визуализацию строк после применения каких-либо команд внутри строку

Кроме первого пункта - с остальным более менее можно жить :)

Hunta
21.11.2024, 14:32
Комментарии к макросам добавлены (на старший байт вводить можно, показываться не будет :) , хотя я думаю над этим - может сделать всё таки?...)

Попутно добрался до причины и до какой-то степени решил ещё одну мозолившую глаза проблему - отступы табами в строках окон дизасма. Не смотря на все попытки обеспечить одинаковую позиция для строк длиной меньше 32-ух символов (комментарий тогда начнётся с 32-ой) - в сгенерённом исходника вроде всё ок, в окнах - разброд и шатания :) Теперь вроде красиво :)

Hunta
23.11.2024, 14:21
Достаточно серьезный внутренний перетрях (кто за что отвечает) в плане визуализации ячеек - теперь за визуализацую отвечает сама ячейка, раньше был отдельный класс (исторически так сложилось), хотя и были поползновения в сторону того, как я сделал сейчас.

Как ни странно, после первичного переноса разных кусков кода в другие места и попутных исправлений - была выявлена всего одна ошибка - в мнемонике директивы остался лишний символ :)

Делалось с определённым прицелом на перетряхивание генерации меток (см про метки внутри макросов), к чему я и приступаю

Hunta
24.11.2024, 11:54
И ещё один внутренний перетрях, связанный с визуализацией команд.

Раньше некоторые поля-аттрибуты ячейки команды (типа режимов адресации и ссылки на регистр) заполнялись в процессе "расшифровки" команды по её описанию - они используются (в первую очередь) для её визуализации. В принципе, это не создавало проблем, так как код полностью контолирую я, но теоретически, можно после расшифровки команды "поправить" эти поля и получить СТРАННОЕ :)

Теперь ссылка на описание команды тоже стала аттрибутом, а всё такие поля перестали быть атррибутами - они выдаются автоматом и изменить их уже не получится :)

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

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

С самим механизмом формирования ссылок и меток фактически не работал, но слегка подправил его для более правильной расстановки меток, которые внутри макросов.

Результат (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-086.jpg)

Выделенное красным - метки генерятся только необходимые, то есть если метка использовалась ТОЛЬКО внутри макроса - её не будет в сгенерированном исходнике :) Не стоит засорять исходник лишним :)

Ну и исходник (http://www.kpxx.ru/Soft/Utils/DisAsm11/TET2.v2.MAC), который получен так же (протыканы макровызовы), но теперь он, без ручных правок, проходит компиляцию-сборку - без ошибок и результат ИДЕНТИЧЕН исходному

Что дальше.

Рефаторинг кода генерации меток для макросов - пока он написал в лоб и так себе :)

Перенос уже описанных макросов из кода программы в шаблоны - пока воевал с метками и ничего нового не перенёс

Ещё была какая-то мысль, но отвлекли телефонным звонком и она вылетела. Вспомню - исправлю этот пункт

Ну и общая причёска-рефакторнинг кода :)

- - - Добавлено - - -

Вдогонку.

Поскольку в исходном варианте генерации (пока) не используются мнемноники для регистров устройств, а так же макросы структурного программирования и мои макросы - соответствующие .INCLUDE теперь комментриуются. Файл сгенерировал новый и перевыложил, но всё остальное осталось как прежде :)

Hunta
24.11.2024, 19:22
Всякие мелкие фиксы шерховатостей.

Добавил доп проверку - если по шаблону идёт ссылка на слово данных, на код или макровызов (то есть чётный адрес) - щаблон не применяется, если обнаружится нечётный адрес. Такое бывает можно встретить в RSX - если на вершину стеку перед EMT 377 грузится НЕЧЁТНОЕ число - значит, блок параметров в стеке, а если ЧЁТНОЕ - то это ссылка на блок параметров. Так что теперь исключены ложные срабатывания типа DIR$ #<нечётный адрес> из-за ошибчного тыканья не в том месте блока инструкций потенциального макровызова.

И добавляю макросы RT-11 в файл шаблонов - из ранее описанных кодом.

Hunta
25.11.2024, 10:20
Из занимательного.

Попробовал отдезассемблировать EDIT.SAV из RT-11 V01-15. Макросы пока не определял (хотя то, что было описано в DisAsm ранее - основывалось на макросы из этой версии). Транслируется без ошибок, собирается без проблем, но в новоявленном EDIT в конце некоторое количество нулевых байт, в том время как в исходном - что-то есть.

Позже попробую посмотреть - почему DisAsm проигнорировал хвост :)

- - - Добавлено - - -

Из вспомнившегося.

Бродит мысль добавить поддержку версионности макросов. С возможностью указать при дизасме - какие версии использовать. Ну и возможностью динамечески - генерировать (и комментировать его исходные команды) или не генерировать (и не комментирвать) макровызов в зависимости от того, что выбрано в интерфейсе.

Но пока в обдумывании - как сделать.

Hunta
25.11.2024, 20:27
Пробежался по EMT, где макровызовы были описаны - AltM, результат оттранслировал-собрал - если добавить ссылку на SYSMAC.SML из RT-11 V01-15 - всё ок. Если брать из 5.7, даже если вызывать ..V1.. (типа - макросы по стандартам V01-15) - есть расхождение

Hunta
28.11.2024, 09:09
Захотелось, как обычно, странного :)

Так что появится поддержка ещё одного формата файлов :) В самом начале, так что показывать пока нечего..

И для поддержки этого формата - (это не начало добавления, но) кое-что для работы с .OBJ файлами появилось.

Плюс - добавил флаг - программа имеет доступ к странице в/в, соответственно - если флаг установлен и другие признаки не блокируют - будет расшифровка адресов регистров в/в в имена. Когда-то давно что-то такое было, но в силу ряда причин - удалил. Вот теперь возвращается :)

От макросов устал и взгляд замылился - так что способ отдохнуть :)

Hunta
16.12.2024, 15:09
Все параметры, которые относились к PDP-11 и были статически отрисованы на пользовательском интерфейсе - теперь выведены в описания и генерируются динамически - в зависимости от выбранного процессора, операционки, типа и субтипа файла. На вскидку (если что-то не упустил) - теперь в ядре DisAsm осталась только одна зависимости от PDP-11 - в модуле генерации исходника. Думаю над ней, пока простого решения что-то не вырисовывается, хоть новый вариант работы с ячейками памяти и облегчил задачу :)

Но поскольку работаю надо очередной странной своей хотелкой (и переработка пользовательского интерфейса пусть и слегка - но её касается) - пока над оставшейся зависимостью думаю в фоне :)

Hunta
20.12.2024, 01:18
Большая работа по рефакторингу (в основном - упрощение внутренней структуры и вынос зависимостей от PDP-11, пока по прежнему - модуль генератора исходника). В процесс "неожиданно выяснилось" :) что опять криво (а в определённых сценариях - вообще не) работает восстановление из файла сеанса в случае программ с перекрытиями. Вроде бы (!!) выяснилось, откуда растут ноги у проблемы и как это (грязноватый хак) исправить. В целом всё крутится вокруг моего желания восстанавливать и фокус ввода на выбранной перед созданием файла сеанса ячейки. Угробил на это примерно три дня. Не полных - так как ещё всякие домашние дела, но пару дней чистыми - скорее всего. Пользовательский интерфейс на WPF - это, конечно, удобно, пока не начнёшь хотеть от него странного :) Ну и большую часть канов - как правильно под него писать - я таки нарушаю :)

В общем, опять возвращаюсь к хотелке странного. Кое что успел сделать, но пока показывать нечего...

Hunta
24.12.2024, 21:08
В хотелке уже кое-что реализовано, но пока показывать нечего.
Попутно - рефакторинг и...
Я всё таки выпилил все зависимости от PDP-11 в генераторе исходника! :) Идею подсказала возня и некоторые решения для поддержки оверлеев :)

Продолжаю пилить хотелку....

Hunta
26.12.2024, 21:24
Продираюсь сквозь документацию, исходники и свой тупизм. Подвижки есть, показывать пока мало что есть, да и то с ошибками :)

Из нового - была давно мысль возможность выбора не только в основном окне дизасма оверлей, но и в дополнительных типа - не трогая основное окно - заглянуть в другой оверлей. Не было мысли - как это реализовать, не загромождая интерфейс :) И вот, сегодня, смотря на цепочку связанных ячеек (первая указывает на вторую, вторая на третью и так далее) - машинально попробовал перетянуть ячейку из доп окна дизасма в основное :) О!! Могучий драг-н-дроп :) Так что теперь работает (почти - мелочи подпилить и добавить сброс оверлея) и такой вариант выбора :)

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

Попутно пришла мысль - иметь возможность блокировать доп окна дизасма от авто-смены и при изменении ячейки (или оверлея) в основном окне. Может пригодиться :)

Hunta
27.12.2024, 02:33
DrugNDrop между окнами дизасма и DrugNDrop оверлея на окна дизасма вроде работает.

Но из-за того, что выбор оверлея происходит при НАЖАТИИ на левую кнопку мыши, а не отпускании и не знаю (по крайне мере пока), как это изменить или победить... Перетаскивание ячеек между окнами дизасма - левой кнопкой мыши, а перетаскивание оверлея на окно дизасма - правой :) А может просто сделаю идентичным...

Hunta
07.01.2025, 02:47
Чем можно исследовать образы системы RSX? :)

RMD? Нет - покажет (и далеко не всё) только у загруженной системы :)

VMR? Нет - только некоторые настройки :)

Теперь (пусть пока и в далеко не полном объёме) - Микроскоп для RSX (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-087-RSX-11M-Plus.jpg) :)

Всё таки успел до конца отпуска сделать что-то, что можно показать :)

Hunta
12.01.2025, 11:54
Задачи, зафиксированные или оставшиеся в образе памяти RSX - это не стандартные образы задачи RSX, поэтому уже имеющийся парсер TSK с ним работать напрямую не сможет. Пришлось поразбираться - откуда можно вытянуть нужную информацию. Процесс более менее двигается - задачи без перекрытий уже показываются без проблем (и привилегированные даже "видят" ядро RSX :).

В работе - программы с перекрытиями. Процесс тоже движется, но пока в самом начале.

Попутно добавил функционала в Mapper, теперь он может поучаствовать в процессе расстановки меток и добавления комментариев. Не сам, понятно (совсем не нужна его прямая завязка на всякие объекты PDP-11) - через посредника. И это позволило (добавив аттрибуты в описание классов) ликвидировать много строчек кода :)

Hunta
14.01.2025, 01:47
Немного разборок с программами с перекрытиями в образе RSX - на примере SAV (http://www.KpXX.Ru/Soft/Utils/DisAsm11/DisAsm11-089-RSX11-M-Plus.jpg) :)

Результат копания - ячейки могут искаться не только вниз по дереву перекрытий (это было сделано давно), но в вверх. Не уверен, что пригодится для обычных файлов TSK (программа то ещё не в памяти и не успела поработать), но для задч в образе RSX - очень даже - программа уже успела поработать и даже что-то из оверлеев загрузить.

На очереди, скорее всего - загруженные драйверы. Но свободное время.. Так что - что-то реально успею сделать только в выходные

Hunta
22.01.2025, 23:40
Перекрытия в RSX - это звиздец, а программа с перекрытиями в образе системы - отдельный звиздец.
Разбирался. И ещё много осталось.

Hunta
25.01.2025, 11:14
С перекрытиями дошёл до некоей логической точки, пока вроде бы всё отрабатывается и на просто задачах и на образе системы - классической RSX+ с поддержкой Data Space и на образе P/OS (собственно, она и инициировала копания в перекрытиях)

Взялся за драйвера - тоже буду смотреть на варианты самостоятельных файлов и в образе систем.

- - - Добавлено - - -

Текущее состояние - микроскоп для RSX+ на примере P/Os 3.2 (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-090-POS3.2.jpg)

Hunta
25.01.2025, 19:52
Первое впечатление - после всех доработок под образы RSX - DisAsm на удивление неплохо стал (по сравнению с тем, что можно было видеть до) справлятся с драйверами. По сути, надо было сделать одну небольшую правку (которая, кстати, давно задумывалась). Ну и то, что для образов была добавлена поддержка работы с STB файлами (а для драйверов они тоже ДОЛЖНЫ быть) - сразу визуализировало имена :) По крайне мере - для векторизованных драйверов :) Надо будет проверить на невекторизованных :)

Дальше - парсинг стандартных блоков данных драйверов. Благо определить их местоположения (благодаря stb файлам) можно, осталось только описать структуру классами C#

- - - Добавлено - - -

Кстати, для драйверов в образе - последнее будет несколько сложней - ибо их файлов stb нетууу.. Но есть другие методы

Hunta
12.02.2025, 23:24
Ещё немного вперёд
Текущее состояние - микроскоп для RSX+ на примере P/Os 3.2 (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-091-POS3.2.jpg)

Hunta
13.02.2025, 15:01
Так, с возможностью "вырезать" ячейки из ядра ОС и оформлять их как отдельный "оверлей-модуль" (началось всё с блоков данных для драйверов) вроде разобрался (хотя может какие нюансы и всплывут - тогда по мере возникновения), можно двигаться дальше - парсить не только DCB, но UCB, SCB и KRB (и кто там ещё есть) в таблицах для драйвера :) Если память мне не изменяет, UCB самый проблемный, остальные вроде попроще...

Hunta
15.02.2025, 14:27
Разборку "сырых" данных в что-то понятное (экземпляры классов) для C# давно делаю через класс-посредник Mapper. То есть на вход подаётся описание класса, массив с "сырыми" данными, смещение, а на выходе экземпляр класса. Причём в нём могут быть как привычные для .NET объекты, так и объекты классов, которые так же создаются из "сырых" данных.

Парсинг таблиц-описателей драйверов RSX строится так же на этой схеме. То есть на вход подаётся ссылка на DCB (device control block) - с него всё начинается, а на выходе хочется получить все структуры - DCB, UCBs (unit control block-и), SCBs (status control block-и) и KRBs (controller request block-и). Пока парсится только DCB. На очереди - UCBs. И тут первые засады. Во первых, структура UСB имеет варианты - есть постоянная часть (и тут с парсингом особых проблем нет), есть переменная часть. Плюс - есть отрицательны смещения (и их структура тоже имеет варианты). Плюс - из DCB ведёт ссылка на первый UCB, плюс из UCB есть ссылки на родительский DCB (остальные CB и RB так же имеет ссылки). И до сих пор с такой организацией данных ещё не сталкивался (ранее всё было проще и площее). Так же - с доработкой DisAsm-11 вожусь уже очень долго и несколько.. подустал :) Так что - таймаут на какое-то время. Дальше, скорее всего, займусь PDP-11X

Hunta
01.03.2025, 20:41
Закопался в приведение в порядок файло-помойки, но попутно...
Страничные ПЗУ - первый подход к снаряду (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-092.jpg)

Hunta
05.03.2025, 20:37
Появилась возможность создавать и указывать макросы вручную, то есть они не цепляются автоматом по кнопке Макро?, а выбираются из списка и применяются к выбранной ячейки.
Но иногда встречаются случаи, которые сложно запихать в макросы (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-093.jpg) - слева два страничных обращений, для которых удалось написать макрос, а вот справа.. только руками. Что возвращает к вопросу о ручном указании - куда ссылается операнд, в какой оверлей...
На и из прикольного - изменения файла макросов отслеживается и автоматом подтягиваются :)

Hunta
10.03.2025, 09:08
Dilog MQ-100 FirmWare - первые шаги, первые части (http://www.kpxx.ru/DEC/PDP-11/Hardware/Dilog MQ-100/FirmWare)

По результатам есть некоторое понимание того, как оно ДОЛЖНО быть. Одно из будущих изменений - будет генерироваться не такое большое количество файлов, в идеале должен получаться один, но... надо пробовать

Ну и как обычно - будет свободное время - буду пробовать...

Hunta
18.03.2025, 00:34
Предыстория

Первой ПЗУ со страничной организацией, которую я дизассемблировал, была от MXV-11. Затем был дизасм ПЗУ от KDJ11-B, потом была попытка дизасма ПЗУ от M11.. Вроде как-то так. Но на M11 слегка обломался, потому что там был использован немного нестандартный подход - не весь код бы размещён на страница одинакового размера, часть кода копировалось в ОЗУ (причём не все слова подряд) и мой первый подход не позволил по быстрому разобраться с (такими) ПЗУ.

То, как делал первоначально - исходный файл ПЗУ распиливался на отдельные страницы, потом каждая страницы дизасмилась, после чего ручками по одной страницы я это всё дело сшивал в исходник, который после компиляции-сборки на выходе давал идентичный исходному двоичный файл. В процессе так же немного разбирался с логикой работы. Процесс длительный, монотонный и с массой ручной работы. Но в принципе - рабочий вариант

Затем появился DisAsm и некоторое количество ручной работы испарилось - знай, смотри в окошки и тыкай кнопсы.

В какой-то момент времени решил добавить поддержку страничных ПЗУ в DisAsm. Первый подход к снаряду, собственно, и реализовывал вышеописанный подход, только стало ещё меньше ручной работы. Плюс - учитывая поддержку в DisAsm макросов - смог сделать автоматическое отслеживание почти для всех сценариев - куда собрался (на какую страницу) перейти код. Но - сшивание отдельных частей - всё ещё ручная работа. Плюс - надо было поправить метки, ибо они генерировались без учёта того, что будет единый файл. То есть - ручной работы стало меньше, но она ещё осталась.

Получив первый (и неполный вариант), как я уже писал - пришло понимание - куда двигаться дальше.

Итак - первый (в бОльшей степени ещё концепт)-вариант поддержки страничных ПЗУ: встречаем (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-094.jpg)

Теперь все страницы - в едином файле и даже какие-то результаты (по адресу M00262 - переход на другую страницу) уже просматриваются. Исходное адресное пространство бьётся (по описанию в файле настроек) на отдельные страницы, можно задавать размер и базовый адрес каждой страницы.

Что в работе - правильная генерация меток (тут уже более-менее) и правильная генерация операндов (с учётом того, что часть кода НЕ ПЕРЕМЕЩАЕМАЯ и будет располагаться совсем по другим адресам. В прошлом варианте корректировалось макросами, в этом варианте будет (пока никак не реализовано) корректироваться операндами-выражениями. Конкретный пример того, что сейчас будет оттранслировано не корректно - команда MOV по адресу 175266.

Работа продолжается

Hunta
29.03.2025, 15:00
Уф.. Первые РЕАЛЬНЫЕ результаты :) То есть - после нажатия кнопки "Сгенерировать MAC" на выходе получаем исходник, которые с некоторыми доработками (добавить ссылку на файл макро-определений и убрать неправильные (работаю над этим) .=175000) ТРАНСЛИРУЕТСЯ, СОБИРАЕТСЯ и даёт ИДЕНТИЧНЫЙ исходному файл :)

Загрузили, ткнули "Макрокоманда?" для вставки макроса начала страницы (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-095.jpg)
На ячейке 175200 ткнули P - получили ссылку на ячейку (правое верхнее окно) - неправильную - ибо на другой странице (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-096.jpg)
"Макрокоманда?" для вставки макроса перехода на другую страницу - и теперь ссылка правильная (http://www.kpxx.ru/Soft/Utils/DisAsm11/DisAsm11-097.jpg)

Страшные выражения как аргумент - как раз и позволяют сгенерировать правильные данные, так как в исходнике, с точки зрения MACRO-11 ячейка находится по адресу 1024, но реально она будет на другой странице и по адресу 175024
Теперь DisAsm начал понимать такие извращения и генерировать правильный аргумент

Не знаю пока - сколько ещё мест в DisAsm надо поправить, что бы он ВСЕГДА генерировал правильные ссылки и аргументы, но сейчас начинается уже этап целевого тестирования и исправления ошибок и неточностей, так как основа - есть. Ну и наведение красоты в показываемом :)

И да - существенную работу делают макросы, в частности, сейчас это (пока?) единственный способ подсказать DisAsm - о какой странице идёт речь :)

Так что такую красоту простым тыканьем кнопок (ну, может когда-нибудь, а пока) не получить - нужен предварительный анализ файла (можно в DisAsm-е же), составление файла описания секций (страниц), а затем подготовка шаблонов макросов для DisAsm и самих макросов для исходнка :) Кстати, для умеющих писать макро-определения и использовать макросы - всё не так уж и страшно :)

Технически - вариант с простым тыканьем кнопок тоже возможен, но его сначала надо продумать :) Но тут, увы, основной упор - в свободное время...

- - - Добавлено - - -

Поправил генерацию исходника. Теперь нужно только добавить ссылку на файл макросов.

Из занимательного - если где-то ссылка ведёт не туда, куда надо - есть шанс, что после сборки новый бинарник с исходным бинарником не совпадёт :) Особенность страничных ПЗУ :)

Немного потыкал кнопсы - результат идентичен оригинальному :)

- - - Добавлено - - -

Поправил генерацию исходника. Теперь нужно только добавить ссылку на файл макросов.

Из занимательного - если где-то ссылка ведёт не туда, куда надо - есть шанс, что после сборки новый бинарник с исходным бинарником не совпадёт :) Особенность страничныз ПЗУ :)

Немного потыкал кнопсы - результат идентичен оригинальному :)

Hunta
29.03.2025, 20:14
Тэкс, красоту показываемого и генерируемго поправил. Может где ещё вылезет - по возникновению буду исправлять.

Начал тыкать кнопсы. Поправил определения макросов (к доработке под секции никаким боком). Потыкал и налетел на очередную ошибку. Лечу :) В смысле исправляю, а не в полёте :)

Hunta
30.03.2025, 12:37
Чистка ошибок (точнее - неучтённых сценариев) продолжается. Пара ошибок генерации и штуки четыре макросов от прошлого подхода пришлось поправить, ибо - не так оно сейчас :) Похоже, скоро будет очередной коммит :)

Hunta
30.03.2025, 22:52
Начал подтягивать оставшуюся часть ПЗУ. Там, по крайне мере вначале, идёт код, который используется для тестирования и для начала переносится в ОЗУ. И процесс переноса не совсем пока понятен. Такое впечатление, что вначале переносится часть кода, потом управление передаётся ей, а она ещё докопирует. Но надо разобраться в логике. Часть кода, которая переносится в ОЗУ - отображена как секция в DisAsm и по крайне мере можно анализировать код. Ну и теперь проверка на совпадения с исходым бинарником тривиальна - генерирую новый исходник, собираю, сравниваю.

Hunta
05.04.2025, 14:12
Помимо доработок по работе со секционированными (язык не поворачивается сказать - страничными - ибо в этом ПЗУ большая их часть разного размера и большая же их часть грузится в ОЗУ для работы) ПЗУ - "распилил" таки его на составные части. Созданный (без дизасма) исходник генерирует идентичный двоичный файл.

Теперь опять доработка работы с секциями - ибо там СТРАШНОЕ в плане ссылок...

- - - Добавлено - - -

Свободного времени, как обычно, катастрофически мало, но с 14-ого в отпуске на две недели - попробую добить и ПЗУ и функционал :)

Hunta
06.04.2025, 10:40
Посмотрев на (промежуточный) результат и подумав, понял, что ошибался. Страницы всё таки есть :) То есть Физическая структура (страницы, одного размера, отображаются через "окно") и Логическая структура. И всё ссылки через "номер секции" - они на самом деле ссылки через номер страницы. Но в некоторых случая вылезают и секции. Работаю дальше :)

Hunta
13.04.2025, 20:25
Физическая структура добавлена и "вписана" в модель структуры DisAsm-11 до варианта, когда на выходе получается уже более-менее вменяемый файл, который транслируется, собирается и проходит сравнение с исходником. Безусловно, какие-то ошибки в логике ещё возможны, что будет выявляться тестированием.

На очереди - работа с (логическими) секциями, которые копируются в ОЗУ и являются взаимосвязанными - то есть из одной секции возможно обращение к коду или данным другой.

Шаг первый - организовать взаимосвязь, шаг второй - генерация ссылок.

Hunta
14.04.2025, 16:50
Пока чистка от ошибок непредусмотренных сценриев и неправильных предположений. А так же пару мест зачистил со странным кодом - могу только предположить - остатки от кода для старой структуры объектов дизасма..

Hunta
18.04.2025, 10:42
Взаимосвязанные секции пока не даются - не могу придумать простой способ описания связи их как объектов в DisAsm. То есть в принципе способы есть, но все получаются или громоздкие или потребуют много кода или переделок. Не хотелось бы...

Пока укладывается в голове, решил проверить - а как (после переделок) с другими типами файлов - много ли сломалось :) Взял (наверное самый тяжеловесный и не до конца доделанный) образ RSX-11M-Plus. Как ни странно, но додедалать и переделать пришлось немного. Но - есть ошибки в генерации кода (по сравнению с предыдущим вариантом). Фиксю..