Всех приветствую в новом году!
Праздники прошли с пользой дела, в результате наконец-то сделал (буквально на одном дыхании!) то, что давным-давно хотел - удобный инструмент длялюбителей поковыряться в...работы с ОЗУ. До этого долго и мучительно пользовался замечательными авторскими программами: EDMEM$ и M128$, но, увы, концептуально они не вписываются в идеологию DSDOS, которая предполагает скорость, удобство и наглядность интерфейса. К тому же авторские утилиты используют не толерантный RET-, а жёсткий JMP-выход по адресу горячего старта ОС ORDOS (BFFDh), т.о. при полном использовании ОЗУ пользователя и затирании кода эмуляции ОРДОС эти утилиты становятся неработоспособными. Это конечно можно вылечить правкой их кода, но остальные неудобства подтолкнули на создание собственной утилиты, объединяющей функции обеих авторских.
По старой-доброй традиции утилита названа "Инструментальный монитор", имя файла - MTOOL$. Начиная с DSDOS v3.86 она интегрирована в ОС и будет идти во всех сборках вместо авторских EDMEM$ и M128$/M256$. Под "интегрированием" понимается возможность её быстрого вызова через сервисное меню ОС (Win-M в PS/2-версии клавиатуры с прошивкой МК v0.21), а также из оболочки (горячая клавиша 'M'). Причём в первом случае производится полное сохранение рабочего экрана ПРК с последующим его восстановлением после выхода из MTOOL. Сохраняются: основной экран (C000..EFFFh@0), атрибуты цвета (C000..EFFFh@1), режим отображения символов, текущий цвет экрана, позиция курсора, текущий диск ОС. Для сохранения требуется 24 Кб свободного места на квазидиске. Если свободно менее 24 Кб, но более 12 Кб, то будет сохранён/восстановлен только основной экран, без атрибутов цвета. Сохранение сделано для того, чтобы инструмент можно было вызывать в любой момент, когда на экране присутствует мигающий курсор, а после выхода работа прерванной программы была продолжена "с того же места". Т.о. MTOOL$ является системной (или оверлейной) программой, работает во второй странице ОЗУ, т.е. его работа прозрачна - не затрагивает ОЗУ основной (нулевой) страницы.
При выходе из MTOOL$, на квазидиске в файле MTOOL.CF сохраняются все текущие параметры: выбранные адреса, номер страницы ОЗУ, границы блока, поисковые запросы и т.д., т.о. при повторном запуске утилиты мы оказываемся как бы в том же самом месте.
Главный экран утилиты представляет собой редактор дампа и выглядит следующим образом:
альт.ссылка на изображение
Поясню назначение полей. Идём сверху вниз, слева направо.
первая строка:
"Адрес" - текущий адрес, где в данный момент находится курсор редактора (по-умолчанию устанавливается в 0000h);
"Страница" - текущая страница ОЗУ, с которой мы работаем (по-умолчанию устанавливается в 0);
"Блок" - диапазон адресов, указывающих на участок ОЗУ, используется в операциях копирования/заполнения/поиска (по-умолчанию устанавливается в 0000h-<RamTOP>);
вторая строка:
"Метка" - адрес для быстрого перехода, адрес начала фрагмента при работе с буфером обмена (по-умолчанию устанавливается в 0000h);
"Буфер... (...)" - размер и тип данных в буфере обмена (если буфер пуст, то значения параметров не отображаются);
"Шаблон" - байт данных, используется для заполнения ячеек ОЗУ константой в одиночных и групповых операциях (по-умолчанию = 00h);
* значения всех параметров в HEX-виде!
ниже идут:
Основное поле текущего шестнадцатиричного дампа, а справа копия этого же дампа в текстовом виде.
под ними находится поле:
"Шрифты 8х8" - копия текущего дампа в графическом виде, "заточенном" под отображение растровых шрифтов 8х8 пикселей (a-ka фонтов).
Пример знакогенератора из ПЗУ Монитора:
альт.ссылка на изображение
Пример знакогенератора ОС DSDOS:
альт.ссылка на изображение
В самом низу экрана находится сокращённая подсказка по управляющим клавишам.
Концепт
Идеология работы с утилитой отличается от M128$. Все операции доступны в одно нажатие, никаких долгих перемещений по пунктам меню и повторов ввода адресов/данных. Все изменения немедленно отображаются в соответствующих полях (изменения ячеек ОЗУ - во всех трёх видах отображения текущего дампа):
альт.ссылка на изображение
Все виды операций доступны для любой страницы ОЗУ - текущей в данный момент. Групповые операции с массивом данных выполняются по адресам блока. При переносе/вставке массива/фрагмента данных производится проверка на корректность ("заворачивание" адреса и превышение критической границы F000h), при некорректных значениях операция не выполняется и звучит сигнал ошибки (концепт "защита от дурочки").
Редактор дампа
Как наиболее важная и первоочередная функция, редактор предстаёт пользователю сразу после загрузки утилиты.
Возможно редактирование в двух режимах: "Байтовый" (выбран по-умолчанию) и "Текстовый", переключение между ними с помощью клавиши [Tab]:
альт.ссылка на изображение
Для навигации используются следующие клавиши:
[←], [→], [↑] и [↓] - перемещение по текущему дампу;
[Ctrl]+ [←], [→] - перемещение по адресам результатов поиска (работает после выполнения соответствующей команды, см. ниже);
[Ctrl]+ [↑] / [↓] или [PgUp] / [PgDown] - перемещение к предыдущему/следующему дампу;
[Home] / [End] - в начало/конец текущей строки;
[Shift]+ [Home] / [End] - в начало/конец текущего дампа;
[Ctrl]+ [Home] / [End] - в начало/конец блока;
[F2] - ввести новый текущий адрес*;
[Shift]+ [F2] - ввести новый адрес метки*;
[Ctrl]+ [N] - присвоить адресу метки текущий адрес (поставить метку);
[Ctrl]+ [G] - присвоить адрес метки текущему адресу (переход к метке);
[Ctrl]+ [F2] - ввести новые адреса начала и конца блока (можно ввести только адрес начала, а затем нажать [Esc] - адрес конца останется прежний)*;
[Ctrl]+[Shift]+ [F2] - ввести новый адрес конца блока*;
[Ctrl]+[Shift]+ [F3] - адресу начала блока присвоить адрес метки, а адресу конца блока - текущий (быстрое выделение блока);
[Ctrl]+ [<0..7>] - выбор текущей страницы ОЗУ**;
[F5] - обновление экрана (полная перерисовка);
[F4] - выход из утилиты MTOOL$ с сохранением параметров;
[Shift]+ [F4] - выход из утилиты без сохранения параметров (ранее созданный файл MTOOL.CF также удаляется!);
* вводятся шестнадцатеричные значения параметров, обязателен ввод всех четырёх цифр адреса; новое значение вступает в силу после ввода последней цифры;
ввод параметра можно прервать нажатием [Esc], при этом восстанавливается старое значение.
** максимально доступное значение зависит от реального объёма ОЗУ в ПРК, которое определяется загрузчиком ОС DSDOS; при попытке выбора недоступной страницы ОЗУ прозвучит сигнал ошибки и страница не сменится! При выборе страницы равной текущей обновление информации на экране не произойдёт.
Клавиши редактирования
"Байтовый" режим:
[Tab] - переключение в "Текстовый" режим (адрес ячейки в дампе сохраняется, курсор переходит в поле символов);
[Пробел] - выбор ниббла текущего байта*;
[0..9], [A..F] - модификация значения текущей ячейки ОЗУ, после ввода последней цифры текущего байта курсор переходит к следующему в пределах текущего дампа;
[-] - декремент значения текущей ячейки ОЗУ;
[+] - инкремент значения текущей ячейки ОЗУ;
[\] - обмен нибблов байта текущей ячейки ОЗУ;
[<] - циклический сдвиг значения текущей ячейки ОЗУ влево;
[>] - циклический сдвиг значения текущей ячейки ОЗУ вправо;
[F1] - обнуление значения текущей ячейки ОЗУ;
[Забой] - инверсия значения текущей ячейки ОЗУ;
[N] - логическое "AND" значения текущей ячейки ОЗУ с шаблоном (результат записывается в текущую ячейку);
[O] - логическое "OR" значения текущей ячейки ОЗУ с шаблоном (результат записывается в текущую ячейку);
[X] - логическое "XOR" значения текущей ячейки ОЗУ с шаблоном (результат записывается в текущую ячейку);
[P] - заполнить блок по шаблону.
* для ускорения навигации при перемещении между ячейками курсор всегда устанавливается на начало байта (старший ниббл), если требуется изменить только младший ниббл, то старший пробелом пропускается; при нахождении курсора на младшем ниббле (второй цифре байта) нажатие пробела переместит курсор на старший ниббл (первую цифру байта).
Ввод любого ниббла байта немедленно модифицирует значение текущей ячейки ОЗУ! Отката изменений в данной версии утилиты нет.
"Текстовый" режим:
[Tab] - переключение в "Байтовый" режим (адрес ячейки в дампе сохраняется, курсор переходит в поле редактора байтов);
['Пробел'..'ъ'] - ввод символов с кодами 20h..FFh, курсор переходит к следующему в пределах текущего дампа;
[F1] - вставка признака конца строки (байт 00h) в текущую ячейку ОЗУ;
[Ctrl]+ [E] - смена кодировки текущего символа (ORDOS/DSDOS);
[Ctrl]+ [K] - смена регистра текущего символа (актуально только для кодировки DSDOS! в кодировке ORDOS меняется язык РУС/LAT);
Общие для обоих режимов:
[Ctrl]+ [Enter] - сохранить значение текущей ячейки в шаблон;
[Shift]+ [Enter] - ввести новое значение шаблона*;
[Enter] - заменить значение текущей ячейки на значение шаблона;
[F3] - скопировать блок по текущему адресу;
[Ctrl]+ [F3] - скопировать фрагмент в буфер обмена**;
[Shift]+ [F3] - вставить фрагмент из буфера обмена по текущему адресу;
* вводится шестнадцатеричное значение параметра, обязателен ввод двух цифр; новое значение вступает в силу после ввода последней цифры;
ввод параметра можно прервать нажатием [Esc], при этом восстанавливается старое значение.
** фрагментом считается участок дампа от адреса метки до текущего, включительно.
Редактор имеет три параллельных механизма переноса данных: 1) Шаблон, 2) Блок и 3) Буфер обмена.
Шаблон позволяет переносить только один байт данных, блок и буфер обмена - до 60 Кб. Шаблон и буфер обмена позволяют осуществлять перенос данных между страницами ОЗУ (копируем на одной странице, вставляем на другой).
Ввод адресов
Для удобства запоминания ввод адресов ассоциирован с клавишей [F2]. Без добавления управляющих клавиш вводится текущий адрес:
альт.ссылка на изображение
Старое значение адреса стирается, и редактор готов к вводу нового. В этом режиме воспринимаются только цифры [0..9] и латинские буквы [A..F], в последнем случае текущий регистр и язык ввода роли не играют, нажатия на соответствующие буквы интерпретируются корректно:
альт.ссылка на изображение
Значение параметра обновляется после ввода последней цифры. Отмена ввода нового значения параметра - с помощью клавиши [Esc], при этом старое значение параметра восстанавливается.
Добавление управляющей клавиши [Shift] вводит адрес метки:
альт.ссылка на изображение
Добавление управляющей клавиши [Ctrl] вводит адреса блока. Сначала запрашивается адрес начала:
альт.ссылка на изображение
а затем адрес конца:
альт.ссылка на изображение
Если требуется изменить только адрес начала, то после его ввода нажимаем [Esc].
Если требуется изменить только адрес конца, то удерживаем одновременно обе управляющие клавиши: [Ctrl]+[Shift].
Шаблон
По аналогии, все операции связанные с Шаблоном ассоциированы с клавишей [Enter]. Без добавления управляющих клавиш производится вставка шаблона по текущему адресу, при этом для удобства при многократных операциях автоматически курсор переходит на следующий байт (символ).
Добавление управляющей клавиши [Ctrl] копирует значение текущей ячейки ОЗУ в шаблон.
Значение шаблона также можно ввести вручную, для этого добавляется управляющая клавиша [Shift]:
альт.ссылка на изображение
Копирование блока
При операции копирования, дамп выделенного блока копируется начиная с текущего адреса.
Т.е. сначала задаём границы копируемого блока, как было описано выше, либо с помощью быстрого выделения [Ctrl]+[Shift]+[F3].
Для примера выделим фрагмент строки "Слишком большой файл":
альт.ссылка на изображение
В данном примере метка стоит на конце исходной строки по адресу 0013h, а курсор по адресу 0000h. Операция быстрого выделения сама определяет который из адресов старше, и в соответствии с этим корректно берёт значения начала и конца блока.
Далее перемещаем курсор по адресу, куда требуется скопировать блок (в данном примере - 0020h), и нажимаем [F3]:
альт.ссылка на изображение
Блок скопирован.
Буфер обмена
Используется для переноса (копирования) данных между участками дампов ОЗУ, между страницами ОЗУ и между программами. В данной утилите также может использоваться для копирования участка дампа в качестве образца для поиска.
MTOOL$ различает два зарезервированных в ОС DSDOS типа данных: "HEX" (01h) и "TXT" (03h). При копировании в буфер обмена маркировка типа данных производится согласно текущему режиму: "Байтовый" = "HEX" (01h), "Текстовый" = "TXT" (03h). При вставке из буфера тип данных игнорируется, данные вставляются всегда как дамп, т.о. возможна вставка любых данных из других программ.
Для копирования данных в буфер обмена, сначала выделяем фрагмент.
Для этого адрес начала фрагмента записываем в метку ([Ctrl]+[N] или [Shift]+[F2]):
альт.ссылка на изображение
Затем перемещаем курсор к адресу конца фрагмента и нажимаем [Ctrl]+[F3] (или [Ctrl]+[Ins] на клавиатуре PS/2 с прошивкой МК v0.21).
В результате фрагмент записан в буфере обмена под соответствующим типом данных:
альт.ссылка на изображение
Для вставки фрагмента из буфера обмена перемещаем курсор на адрес начала места вставки и нажимаем [Shift]+[F3] (или [Shift]+[Ins] на клавиатуре PS/2 с прошивкой МК v0.21).
альт.ссылка на изображение
Фрагмент вставлен.
Как было сказано выше, вставку можно делать в другой странице ОЗУ, т.о. легко делается перенос данных между страницами.
А также данные в буфер обмена могли быть скопированы ранее из другой программы и вставлены в MTOOL$, либо скопированы из MTOOL$, а использованы в другой программе. Например, можно скопировать текстовое сообщение (в текстовом режиме) из дампа программы, а затем вставить его в текстовом редакторе, и наоборот.
Пример копирования бинарных данных (фонтов) через буфер обмена:
Выделяем и копируем фрагмент (BB80h..BBFFh) в буфер обмена (тип данных = 01h):
альт.ссылка на изображение
Перемещаемся на адрес начала, куда будем вставлять (участок BB00h..BB7Fh):
альт.ссылка на изображение
Вставляем:
альт.ссылка на изображение
Результат наглядно виден по графическому полю.
Если что-то пошло не так...
Механизм "Защиты от дурочки" не позволяет при блочных операциях испортить системную область непереключаемого ОЗУ F000h..F3FFh, а также копировать данные в порты F400h..FFFFh (модифицировать ячейки портов по отдельности можно). Однако "наломать дров" всё же есть возможность, в частности испортить область ОС DSDOS в странице ОЗУ №1, содержимое файлов квазидиска - страницы 2..3(7) или скопировать данные в экранную область. Порча системных данных вероятнее всего фатальна, в результате потребуется холодная перезагрузка ОС, испорченные файлы не восстановить - тут пользователь должен сам "думать головой".
А вот последнюю ситуацию (с экраном) возможно оперативно и без последствий исправить.
Для примера нечаянно скопировали мусор в экранную область:
альт.ссылка на изображение
Ничего страшного, нажимаем клавишу [F5], в результате экран утилиты полностью перерисовывается:
альт.ссылка на изображение
Сравнение дампов
Сравнение дампов выполняется по команде [Ctrl]+[C]. Происходит побайтовое сравнение блока с дампом начиная с текущего адреса.
Возьмём результаты примера со скопированными фонтами, и сравним оригинал с копией. Блок копии у нас уже выделен, ставим курсор на начало оригинала и даём команду сравнения:
альт.ссылка на изображение
Копировщик в прошлом примере не подвёлДанные идентичны:
альт.ссылка на изображение
Нарочно испортим 16 первых байт оригинала (затрём кодом 30h из шаблона):
альт.ссылка на изображение
И повторим сравнение. Вновь техника не обманула, несоответствия выявлены:
альт.ссылка на изображение
Результаты сравнения выводятся в отдельном окне, поверх полей данных редактора. Если кол-во результатов не помещается в окне, то происходит скроллинг. Приостановить процесс скроллинга можно нажатием любой клавиши, продолжить также любой клавишей, кроме [Esc], последняя отменяет процесс сравнения.
По окончании сравнения выводится общий счётчик несовпадений (в десятичном виде). Возврат в редактор - по любой клавише.
Поиск фрагмента
Поиск фрагмента производится в пределах блока! Поэтому сначала определяем границы блока, а потом даём команду поиска - [Ctrl]+[F].
Открывается диалог ввода образца поиска:
альт.ссылка на изображение
Возможны два варианта ввода: "Байтовый" и "Текстовый". Переключение между ними по клавише [Tab]. Переключаться можно в любой момент, в т.ч. "посреди дороги" во время ввода, при этом содержимое строки отобразится в соответствующем виде, и ввод будет продолжен в новом режиме. Максимальная длина образца поиска - 255 байт (символов).
Доступны следующие клавиши при вводе/редактировании образца:
"Байтовый" режим:
[0..9], [A..F] - ввод текущего байта, после ввода последней цифры текущего байта курсор переходит к следующему
"Текстовый" режим:
['Пробел'..'ъ'] - ввод символов с кодами 20h..FFh
Общие для обоих режимов:
[←], [Забой] - удаление последнего байта/символа;
[→] - открыть ("вспомнить") следующий байт/символ*;
[↑] или [↓] - восстановить образец предыдущего поиска;
[СТР] или [PgDown] - очистить строку;
[Esc] - отмена операции, возврат в редактор;
[Enter] - запуск процесса поиска;
[F3] или [Shift]+[F3] (или [Shift]+[Ins] на клавиатуре PS/2 с прошивкой МК v0.21) - вставить фрагмент поиска из буфера обмена**;
* На самом деле буфер ввода всегда состоит из 255 байтов/символов, из которых значащие (видимые на экране и участвующие в поиске) ограничиваются искусственно (по нажатию [Enter]). Т.о. есть возможность открыть ("вспомнить") все 255 байт/символов буфера строки образца.
При вставке в строку образца фрагмента из буфера обмена, учитывается тип данных, в соответствии с ним автоматически переключается режим отображения:
альт.ссылка на изображение
* Вставка фрагмента из буфера обмена возможна только при условии, что размер данных не превышает 255 байт! В противном случае вставка игнорируется.
После вставки, можно изменить режим и продолжить редактирование:
альт.ссылка на изображение
После завершения ввода образца, запускаем процесс поиска ([Enter]):
альт.ссылка на изображение
Если образец занимает более одной строки, то он визуально усекается, а в хвосте добавляется многоточие, т.к. остальная часть окна используется для отображения процесса поиска.
При анализе больших массивов выводится анимация - вращающийся "индикатор прогресса".
При обнаружении совпадений, выводятся адреса вхождения участков дампа. Также эти адреса запоминаются в специальном буфере, т.о. впоследствии, в редакторе дампа по ним можно быстро перемещаться с помощью [Ctrl]+ [←], [→].
Для приостановки процесса поиска нужно нажать любую клавишу. Продолжение также по любой клавише, кроме [Esc], последняя отменяет поиск и возвращает в редактор.
По окончании процесса выводится общее кол-во вхождений образца и предлагаются два варианта выхода в редактор:
альт.ссылка на изображение
По [Enter] мы автоматически выходим в редактор по адресу первого вхождения образца. По любой другой клавише мы возвращаемся в редактор по текущему адресу, при этом указатель быстрых переходов по результатам поиска установлен на адрес последнего вхождения образца, т.е. переходы по результатам [Ctrl]+[←] будут идти с конца.
Например, жмём [Enter] и переходим к первому результату:
альт.ссылка на изображение
Затем нажимаем [Ctrl]+[→] и переходим к следующему:
альт.ссылка на изображение
Аналогично можно перемещаться в "текстовом" режиме...
[Ctrl]+[←]:
альт.ссылка на изображение
[Ctrl]+[→]:
альт.ссылка на изображение
Содержимое буфера адресов результатов сохраняется до следующего поиска.
При повторном поиске клавишей [→] можно посимвольно "вспоминать" предыдущий образец:
альт.ссылка на изображение
или восстановить его сразу весь по клавише [↑].
Передача управления по адресу
При нажатии комбинации [Ctrl]+[Shift]+[G] выполняется CALL-вызов кода в нулевой странице по текущему адресу. Работает только если текущая страница ОЗУ = 0 !
Возврат производится обратно в MTOOL$, при этом полностью перерисовывается экран и восстанавливаются режимы отображения (полноэкранный, б/цветный и т.д.).
Коды клавиш
Часто необходимая при программирования функция - получение HEX-кодов клавиш. В MTOOL$ вызывается в "Байтовом" режиме по клавише [K].
Открывается окно, в котором отображаются символы и коды нажимаемых клавиш:
альт.ссылка на изображение
Выводятся символ и код, полученные подпрограммой BIOS ОС DSDOS.
Если нажатую клавишу чуть задержать, то выводится дополнительный вариант кода, полученного подпрограммой Монитора 0F81Bh:
альт.ссылка на изображение
Т.к. BIOS осуществляет преобразование кодов в соответствии с типом используемой клавиатуры, то значения для некоторых клавиш (или сочетаний) могут различаться с п/п Монитора.
Выход в редактор по клавише [Esc].
П.С.:
В планах дополнить функционал возможностью оперативного сохранения блока в виде файла и возможно ещё чем-то.
Вывод контрольных сумм не реализован в виду их полной неактуальности на момент создания утилиты![]()










































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