Улучшение монитора Радио-86РК

Советский компьютер Радио-86РК (1986) и его клоны

Moderator: Shaos

User avatar
Alikberov
Doomed
Posts: 355
Joined: 14 Oct 2019 18:10
Location: Tashkent

Улучшение монитора Радио-86РК

Post by Alikberov »

Развёрнутое описание отсюда.

Как известно, стандартный авторский Монитор РАДИО-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: Select all

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 байтов - код восстановления, который сам себя восстановить не сможет/!\ :exclaim:
User avatar
Alikberov
Doomed
Posts: 355
Joined: 14 Oct 2019 18:10
Location: Tashkent

Монитор от 5 марта

Post by Alikberov »

В рамках темы про 64 Кб переработан исходный Монитор¹, но с максимальной обратной совместимостью.
Монитор может функционировать на любом РЛК РАДИО-86РК, а также поддерживает и экспериментальный вариант с ОЗУ в 64 Кб (65536 байтов).
  • «D<начало>,<конец>,,<1XX>» - выводит дамп страницы XX ROM-Диска²
  • «L<начало>,<конец>,,<1XX>» - выводит текст страницы XX ROM-Диска²
  • «M<адрес>» - выводит/редактирует дамп в строчном формате
  • «S<начало>,<конец>,<код>,<1XX>» - ищет по странице XX ROM-Диска²
  • «T<начало>,<конец>,<куда>,<1XX>» - копирует из страницы XX ROM-Диска²
  • «X» - отображает/редактирует содержимое регистров в строчном формате
¹-Четвёртый параметр может иметь формат «<2XX>», который работает в модели 64 Кб.
²-Поддержка данной схемы Апогея.

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

Подправил подпрограмму вывода символа:
  • Коды 1F/0C имеют наивысший приоритет³
  • Код 1F после очистки экрана сам вызывает F82D
  • Неизвестные Esc-последовательности передаются ловушке
  • Прокрутка экрана производится только в прямоугольнике 64x25 с очисткой последней строки
³-При "холодном старте" код оригинального Монитора очищал служебные ячейки также и для корректной работы кода 1F, иначе при любой комбинации в ячейке 7004 код проигнорировался бы и экран не очистился.

Ограничив прокрутку областью 64x25 несколько ускорился и сам процесс (примерно на 8%).
Директива «D0,FFFF»:
  • В оригинале работает 434 секунды
  • С моими коррекциями - 396 секунд
You do not have the required permissions to view the files attached to this post.
User avatar
Alikberov
Doomed
Posts: 355
Joined: 14 Oct 2019 18:10
Location: Tashkent

Улучшение монитора Радио-86РК

Post by Alikberov »

Итак, основная работа над изменением Монитора практически завершена.

Подпрограммы вывода на экран
  1. CALL F809 выводит символ на экран из регистра C
  2. CALL F80F выводит символ на экран из регистра A (как в «Орионе»)
  3. CALL F815 выводит байт на экран, сохраняя все регистры
  4. CALL F818 выводит на экран текст с утерей регистра A (завершение строки по 00 или >128)
  5. CALL F83F выводит на экран, непосредственно за командой вызова (регистры все сохраняются)
Код подпрограммы вывода символа на экран полностью переписан, поддерживает пользовательский буфер и оконность.
Рабочие ячейки:

Code: Select all

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: Select all

        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»…

Вывод символа на экран
Выложил исходный код подпрограммы оконного вывода с достаточно полным комментированием в свой репозиторий.

P.S.: Пришлось пожертвовать директивами «X» и «C»… :roll:
Для запуска игры «Volcano» следует сначала обнулить ячейки 03EA и 03EE…
You do not have the required permissions to view the files attached to this post.