nedoPC.org

Community for electronics hobbyists, established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 07 Dec 2024 05:37



Reply to topic  [ 18 posts ]  Go to page Previous  1, 2
Улучшение монитора Радио-86РК 
Author Message
Doomed
User avatar

Joined: 14 Oct 2019 18:10
Posts: 346
Location: Tashkent
Reply with quote
Развёрнутое описание отсюда.

Как известно, стандартный авторский Монитор РАДИО-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 байтов - код восстановления, который сам себя восстановить не сможет/!\ :exclaim:


12 Feb 2024 07:00
Profile WWW
Doomed
User avatar

Joined: 14 Oct 2019 18:10
Posts: 346
Location: Tashkent
Reply with quote
В рамках темы про 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 секунд


Attachments:
File comment: Улучшенный "Монитор" от 5 марта
rk64.rom.20240305.zip [1.83 KiB]
Downloaded 40 times
File comment: Процесс корректировки дампа ПЗУ
Дамп_Монитора-64.png
Дамп_Монитора-64.png [ 286.19 KiB | Viewed 769 times ]
File comment: Просмотр содержимого ROM-Диска Апогея в разных страницах
ROM-Диск-Апогея_Монитор-64.png
ROM-Диск-Апогея_Монитор-64.png [ 7.16 KiB | Viewed 796 times ]
04 Mar 2024 15:00
Profile WWW
Doomed
User avatar

Joined: 14 Oct 2019 18:10
Posts: 346
Location: Tashkent
Reply with quote
Итак, основная работа над изменением Монитора практически завершена.

Подпрограммы вывода на экран
  1. CALL F809 выводит символ на экран из регистра C
  2. CALL F80F выводит символ на экран из регистра A (как в «Орионе»)
  3. CALL F815 выводит байт на экран, сохраняя все регистры
  4. CALL F818 выводит на экран текст с утерей регистра A (завершение строки по 00 или >128)
  5. 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»…

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

P.S.: Пришлось пожертвовать директивами «X» и «C»… :roll:
Для запуска игры «Volcano» следует сначала обнулить ячейки 03EA и 03EE…


Attachments:
File comment: Образ Монитора от тринадцатого Марта
rk64.rom.20240313.zip [1.82 KiB]
Downloaded 52 times
File comment: Описание и переход в режим 80x64
SET80X64.RKR.zip [239 Bytes]
Downloaded 45 times
08 Mar 2024 12:00
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 18 posts ]  Go to page Previous  1, 2

Who is online

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

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.