Как известно, стандартный авторский Монитор РАДИО-86РК имеет минимальные встроенные средства отладки кода - директивы G с парой параметров и X. Причём, вторым параметром директивы G указывается адрес прерывания приложения с временным размещением кода F7 - RST 6. Причём, по адресам 0030…0032 прописывается инструкция «JMP FFA2», уничтожая содержимое ячеек безвозвратно! (Очевидно, в CP/M адрес 0030 был стандартной точкой отладки.) Директива G, однако, сохраняет код временно замещённой инструкции в ячейку 7625 и её адрес в ячейки 7623/7624.
Тем самым, приложение может само себя частично восстановить, используя сохранённую служебную информацию, а так как все параметры директив сохраняются в ячейках 7627…762C, то и использовать, в частности, и третий параметр.
«G,<параметр#2>»
«G,<параметр#2>,<параметр#3>»
«G,,<параметр#3>»
Вот, типовой код для таких вызовов:
Code:
PUTHEX: EQU 0F815H PUTEXT: EQU 0F818H GETMEM: EQU 0F830H WARMON: EQU 0F86CH ;;;;;;;;;;;;;;;;;;;;;;;;; STOPTR: EQU 07629H ; Адрес останова (7623 или второй параметр) STOPIC: EQU 07625H ; Сохранённый код инструкции DIRDE: EQU 07629H ; Второй параметр директивы (передаётся в DE) DIRBC: EQU 0762BH ; Третий параметр директивы (передаётся в BC)
ORG 00000H LHLD STOPTR ; Читаем адрес "порчи" (слово в 7623 или 7629) MOV A,H ; и проверяем, ORA L ; был ли второй параметр у директивы G? JZ BEGIN ; Если указатель - "нулевой", значит отсутствует. LDA STOPIC ; Иначе, читаем код инструкции MOV M,A ; и "снимаем порчу" у ячейки, которая "прихворала". BEGIN: XCHG ; Заносим второй параметр в DE. DCX SP ; Корректируем указатель стека DCX SP ; для благополучного возврата в Монитор. LXI H,HELLO ; Сначала поприветствуем пользователя CALL PUTEXT ; скромным сообщением о нормальном запуске. CALL SHOWDE ; Отобразим содержимое DE - второй параметр директивы INX H ; и напечатаем остальное CALL PUTEXT ; сообщение. LHLD DIRBC ; Третий параметр директивы. XCHG ; Теперь отображаем третий параметр директивы и выходим ;;;;;;;;;;;;;;;;;;;;;;;;; SHOWDE: MOV A,D ; Выводим регистр D CALL PUTHEX ; шестнадцатеричным, MOV A,E ; выводим регистр E JMP PUTHEX ; шестнадцатеричным. ;;;;;;;;;;;;;;;;;;;;;;;;; MOV B,C MOV C,H MOV C,C MOV C,E MOV B,D MOV B,L MOV D,D MOV C,A MOV D,M MVI L,031H ;;;;;;;;;;;;;;;;;;;;;;;;; HELLO: DB 00DH,00AH DB 'SECOND PARAMETER IS ',0 DB 00DH,00AH DB 'THIRTH PARAMETER IS ',0
Откуда становится также очевидным, почему второй параметр должен быть не меньше 000C (если программа стартует с 0000): Первые 12 байтов - код восстановления, который сам себя восстановить не сможет/!\
12 Feb 2024 07:00
Alikberov
Doomed
Joined: 14 Oct 2019 18:10 Posts: 346 Location: Tashkent
В рамках темы про 64 Кб переработан исходный Монитор¹, но с максимальной обратной совместимостью. Монитор может функционировать на любом РЛК РАДИО-86РК, а также поддерживает и экспериментальный вариант с ОЗУ в 64 Кб (65536 байтов).
«D<начало>,<конец>,,<1XX>» - выводит дамп страницы XX ROM-Диска²
«L<начало>,<конец>,,<1XX>» - выводит текст страницы XX ROM-Диска²
«M<адрес>» - выводит/редактирует дамп в строчном формате
«S<начало>,<конец>,<код>,<1XX>» - ищет по странице XX ROM-Диска²
«T<начало>,<конец>,<куда>,<1XX>» - копирует из страницы XX ROM-Диска²
«X» - отображает/редактирует содержимое регистров в строчном формате
¹-Четвёртый параметр может иметь формат «<2XX>», который работает в модели 64 Кб. ²-Поддержка данной схемы Апогея.
Наиболее сложные участки Монитора, где требуется строго соблюдать позиции ключевых процедур, приходится редактировать в онлайн дампе.
Прокрутка экрана производится только в прямоугольнике 64x25 с очисткой последней строки
³-При "холодном старте" код оригинального Монитора очищал служебные ячейки также и для корректной работы кода 1F, иначе при любой комбинации в ячейке 7004 код проигнорировался бы и экран не очистился.
Ограничив прокрутку областью 64x25 несколько ускорился и сам процесс (примерно на 8%). Директива «D0,FFFF»:
В оригинале работает 434 секунды
С моими коррекциями - 396 секунд
Attachments:
File comment: Улучшенный "Монитор" от 5 марта rk64.rom.20240305.zip [1.83 KiB]
Downloaded 40 times
File comment: Процесс корректировки дампа ПЗУ
Дамп_Монитора-64.png [ 286.19 KiB | Viewed 769 times ]
File comment: Просмотр содержимого ROM-Диска Апогея в разных страницах
ROM-Диск-Апогея_Монитор-64.png [ 7.16 KiB | Viewed 796 times ]
04 Mar 2024 15:00
Alikberov
Doomed
Joined: 14 Oct 2019 18:10 Posts: 346 Location: Tashkent
Итак, основная работа над изменением Монитора практически завершена.
Подпрограммы вывода на экран
CALL F809 выводит символ на экран из регистра C
CALL F80F выводит символ на экран из регистра A (как в «Орионе»)
CALL F815 выводит байт на экран, сохраняя все регистры
CALL F818 выводит на экран текст с утерей регистра A (завершение строки по 00 или >128)
CALL F83F выводит на экран, непосредственно за командой вызова (регистры все сохраняются)
Код подпрограммы вывода символа на экран полностью переписан, поддерживает пользовательский буфер и оконность. Рабочие ячейки:
Code:
CONADR: EQU 07600H ; Адрес символа под курсором в памяти; CONPOS: EQU 07602H ; Координаты позиции X,Y курсора на экране; CON@PX: EQU 07602H ; Консольная позиция курсора по X; CON@PY: EQU 07603H ; Консольная позиция курсора по Y; CONSTA: EQU 07604H ; Консольный статус в Escape-последовательности; CONLEN: EQU 0760FH ; Ширина одного знакоряда в настройках ИМС ВГ75 (стандарт: 78); CONORG: EQU 07610H ; Консольный организатор окна с позицией X1,Y1 относительно начала буфера; CON@XO: EQU 07610H ; Консольная абсолютная позиция окна по горизонтали (стандарт: 8); CON@YO: EQU 07611H ; Консольная абсолютная позиция окна по вертикали (стандарт: 3); CONBOX: EQU 07612H ; Относительный размер бокса ограничителя окна на экране (стандарт: 63x24); CON@XS: EQU 07612H ; Относительный размер окна по горизонтали с указанием крайнего правого столбца (стандарт: 63); CON@YS: EQU 07613H ; Относительный размер окна по вертикали с указанием крайней нижней строки (стандарт: 24)
Тем самым, подпрограмма Монитора уже поддерживает оконность (от 1x1 до 80x64) и может полноценно работать с буфером в любом месте ОЗУ. Исключения составляют только коды:
19 - Перемещает позицию курсора лишь до верхней основной строки окна, затем - прокручивает область вниз;
1B - Помимо установки курсора в нужную позицию по Escape-команде «Y», все остальные комбинации перенаправляет в драйвер пользователя, вызываемый через ловушку;
1F/0C - Перезапускают ВТ57/ВГ75 в стандартный режим 78x30 в буфере 76D0…7FF3 с окном 64x25 в позиции 8,3;
1F - Очищает буфер 76D0…7FFF и перезапускает ВТ57/ВГ75 на стандартный режим
Подпрограмма управления режимом экрана
CALL F83C устанавливает режимы ВТ57 и ВГ75 в соответствии с таблицей по адресу в HL
Для переключения режима ВТ57 и ВГ75 достаточно в HL загрузить адрес на таблицу с описанием режима и вызвать подпрограмму. Формат таблицы таков:
Чётные ячейки адресуют порт и должны быть >80h
Нечётные ячейки содержат записываемые в порт параметры
Исходная таблица описания стандартного режима:
Code:
DB 0E8h ; Адрес порта E8E8 DB 080h ; Код режима для ПДП DB 0E4h ; Адрес порта E4E4 DB 0D0h ; Младший байт адреса буфера экрана DB 0E4h ; Адрес порта E4E4 DB 076h ; Старший байт адреса буфера экрана DB 0E5h ; Адрес порта E5E5 DB 023h ; Младший байт счётчика циклов DB 0E5h ; Адрес порта E5E5 DB 049h ; Старший байт счётчика циклов и режим канала DB 0C1h ; Адрес порта C1C1 DB 049h ; Команда установки режима DB 0C0h ; Адрес порта C0C0 DB 04Dh ; Размер экрана по горизонтали DB 0C0h ; Адрес порта C0C0 DB 01Dh ; Размер экрана по вертикали DB 0C0h ; Адрес порта C0C0 DB 099h ; Позиция линии курсора и высота знакоместа DB 0C0h ; Адрес порта C0C0 DB 093h ; Режим отображения курсора и прочее DB 0C1h ; Адрес порта C1C1 DB 027h ; Код запуска отображения DB 020h ; Ожидается код >80h, иначе - маска для ожидания статуса DB 0E8h ; Адрес порта E8E8 DB 0A4h ; Код запуска ПДП
Естественно, служебные ячейки с параметрами окна нужно корректировать непосредственно.
Ниже - сам образ ПЗУ Монитора и подгружаемый файл с режимом 80x64.
После запуска программы с переходом по G0 режим экрана переключается и управление возвращается Монитору, что позволяет использовать все директивы в установленном режиме: Даже директивы «I» и «O»! Выход из режима, как выше и говорилось, клавиша «Стр» или «Home»…
Users browsing this forum: Google [Bot] and 2 guests
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum