Орион-Про/Примеры использования подпрограмм BIOS
| Данный материал защищён авторскими правами!
Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей. Автор: (C) 1990-1996 ORIONSOFT |
1. Аннотация
В данном руководстве описан порядок и рассмотрены примеры использования некоторых стандартных подпрограмм BIOS в режиме «Orion-Pro». Значительная часть вопросов касается применения драйвера дисплея «TV-PRO». Работоспособность приведенных фрагментов программ проверена на ассемблере TASM фирмы «OrionSoft».
2. Общие положения
Описываемые подпрограммы BIOS доступны только в режиме «Orion-Pro», поэтому программа пользователя при старте должна проверять, установлен ли данный режим. Указанную проверку можно выполнить с помощью следующих команд:
START:IN A,(0AH) ;ЧИТАТЬ ПОРТ ДИСПЕТЧЕРА
RLCA ;"CY" - РЕЖИМ "O-128"
JP NC,... ;НОРМАЛЬНОЕ ПРОДОЛЖЕНИЕ ПРОГРАММЫ
LD HL,PROREQ
CALL 0F818H
JP ... ;ВЫХОД ИЗ ПРОГРАММЫ
;
PROREQ:DB 1FH,07H,1BH,'Y',2BH,31H
DB '"ORION-PRO" MODE IS REQUIRED!',0
Если программу, начинающаяся с такой проверки, запустить в режиме «Orion-128», то на экран будет выведено сообщение:
"ORION-PRO" MODE IS REQUIRED! (Требуется режим «Orion-Pro»)
Обращаем Ваше внимание на то, что сообщение выводится заглавными латинскими буквами, так как коды этих букв одинаковы в любой кодировке (КОИ7, КОИ8, ALT).
В BIOS предусмотрена возможность входа в режим «Orion-Pro» из режима «Orion-128», однако этот вопрос требует особого рассмотрения и здесь не обсуждается.
В некоторых управляющих векторах BIOS (в частности 0F806H, 0F80CH, 0F80FH, 0F82AH) имеются парные («зеркальные») подпрограммы: для установки определенных параметров и для получения их значений. Если разрабатываемая программа не предназначена для резидентной (постоянной) настройки каких-либо параметров, то их прежние значения должны быть возвращены при выходе из программы. Пусть, например, Ваша программа временно изменяет коды цветов фона и изображения, тогда последовательность вызова соответствующих стандартных подпрограмм должна быть следующей:
. . .
LD A,11
CALL 0F80CH ;(C) - ТЕКУЩИЙ ЦВЕТ ФОНА
LD B,C
LD A,13
CALL 0F80CH ;(C) - ТЕКУЩИЙ ЦВЕТ ИЗОБРАЖЕНИЯ
;
PUSH BC ;СОХРАНИТЬ КОДЫ ЦВЕТОВ
. . .
;ДАЛЕЕ МОЖНО МЕНЯТЬ КОДЫ ЦВЕТОВ С ПОМОЩЬЮ
;ФУНКЦИЙ A=10, A=12 ВЕКТОРА 0F80CH
. . .
POP BC
;
LD A,12
CALL 0F80CH ;ВЕРНУТЬ ЦВЕТ ИЗОБРАЖЕНИЯ
LD C,B
LD A,10
CALL 0F80CH ;ВЕРНУТЬ ЦВЕТ ФОНА
. . .
;КОНЕЦ ПРОГРАММЫ
Специальные программы резидентной установки параметров, например, загрузки шрифтов пользователя или настройки таблиц функциональных клавиш, могут «безвозвратно» изменять требуемые значения. Перечень сохраняемых и несохраняемых параметров определяет сам программист, исходя из того, что должна делать программа.
3. Ответы на вопросы
В данном разделе мы попытаемся в простой форме ответить на наиболее актуальные вопросы, связанные с применением стандартных подпрограмм BIOS, в частности драйвера «TV-PRO».
- ВОПРОС 1
- «В таблице векторов BIOS появилось много новых подпрограмм. Я не знаю, с чего начать их изучение, не понимаю, как их использовать».
ОТВЕТ 1:
Расширение набора стандартных подпрограмм было вызвано необходимостью управления новыми аппаратными ресурсами компьютера и требованием максимального использования его возможностей.
Каждая из стандартных подпрограмм BIOS имеет определенное функциональное назначение и служит для выполнения элементарной функции, действие которой описано в документации. Если Вы с чем-то не можете разобраться — обращайтесь с вопросом к нам.
Заметим, что фирмой «OrionSoft» разработана библиотека подпрограмм для популярного компилятора TURBO PASCAL V3.0, обеспечивающая реализацию всех возможностей BIOS «Orion-Pro», в том числе драйвера «TV-PRO». При наличии этой библиотеки процесс создания качественных программ для «Pro» становится простым и естественным, и программист освобождается от необходимости учета той массы тонкостей, которые возникают при работе с ассемблером. Если же Вы решили проявить упорство и детально разобраться с нашими подпрограммами BIOS, прочтите настоящее руководство, и многие вопросы отпадут сами собой.
Для начала рассмотрим назначение управляющих кодов и последовательностей в подпрограмме вывода символа 0F809H. Чтобы проверить их действие, наберите простую программу (здесь и далее мы будем подразумевать, что каждая программа начинается с блока проверки, описанного в П.2):
. . . ;БЛОК ПРОВЕРКИ ИЗ П.2
;
M1:CALL 0F803H ;ВВОД СИМВОЛА С КЛАВИАТУРЫ
LD C,A
CALL 0F809H ;ВЫВОД СИМВОЛА НА ЭКРАН
JR M1
После ассемблирования и запуска программы на экране появится мигающий курсор. Возьмите описание управляющих кодов «TV-PRO» и проверьте их работу, нажимая на соответствующие клавиши (заметим, что обычно управляющие коды и ESC-последовательности поступают на вход подпрограммы 0F809H не напрямую с клавиатуры, а формируются программно). Ниже предлагается ориентировочный порядок освоения управляющих кодов. Для обозначения нажатия символьной клавиши одновременно с клавишей <УПР> будем использовать значок ^ («крышечка»). Например, комбинация ^P соответствует управляющему коду 10H и означает, что сначала необходимо нажать клавишу <УПР>, а затем, не отпуская ее, клавишу <P> (лат).
Попробуйте нажать клавиши управления курсором — курсор будет перемещаться по экрану, в том числе при нажатии клавиш <ВК>, <ТАБ>.
Клавиша <ПС>, нажатая при нахождении курсора в нижней строке экрана, вызывает его «прокрутку» (скроллинг).
Клавиша <СТР> очищает экран и устанавливает его в левый верхний угол (Home). Аналогично действует клавиша <Угол>.
Для проверки вывода символов с кодами 00H..1FH нажмите последовательно комбинацию ^P, а затем второй управляющий символ, например, ^E (05H). На экране появится изображение символа с кодом 05H.
Действие управляющих ESC-последовательностей можно проверить, нажимая в начале клавишу <АР2>, а затем последовательно вводя символы, которые следуют за кодом ESC.
<АР2><6> — после последовательного нажатия клавиш <АР2> и <6> символы будут выводиться в инверсном виде. Для отключения инверсии введите <АР2><7>.
<АР2><8> — включает режим подчеркивания выводимых символов символом курсора, <АР2><9> — выключает режим подчеркивания.
<АР2><R>^J — устанавливает курсор в виде прямоугольника высотой 10 пикселей (комбинации ^J соответствует код 0AH=10). Попробуйте теперь включить режим подчеркивания с помощью <АР2><8> - символы будут «забиваться». Поэтому подчеркивание можно использовать только со стандартным курсором в виде черточки: попробуйте набрать <АР2><R>^A.
Заполните экран любыми символами. Подведите курсор в середину экрана и проверьте работу последовательностей <АР2><L> и <АР2><M>, которые соответственно вставляют и удаляют строку.
Проверьте также действие <АР2><K> и <АР2><J> (стирание текста от курсора до конца строки и стирание текста от курсора до конца экрана).
Нажатие <АР2><E> приведет к очистке экрана без изменения позиции курсора, а <АР2><H> — к установке курсора в позицию «Home» без очистки экрана.
Можете поэкспериментировать с режимами отображения курсора, нажимая <АР2><:>, <АР2><;>, <АР2>< < >, <АР2><=>. Действие последовательностей <АР2><:> и <АР2><=> будет выглядеть одинаково, но на самом деле это не так. В первом случае курсор отображается при выводе любого символа, во втором — только при вводе с клавиатуры.
Теперь можно проверить работу «TV-PRO» в различных цветовых режимах и с различными экранами.
Для перехода в 4-цветный режим нажмите <АР2><U><4>. На экране появится цветной «мусор». Установите альтернативную палитру нажатием клавиш <АР2><T><1>. Задайте цвета фона и изображения с помощью последовательности <АР2><F><1><0> (символы будут выводиться белыми на синем фоне). Для очистки экрана нажмите клавишу <СТР>.
Напомним, что при переключении цветового режима программист должен всегда устанавливать требуемые цвета фона и изображения, так как коды цветов в различных режимах разные.
Попробуйте поменять цвета с помощью нажатия клавиш <АР2><F><3><2> и других комбинаций.
Переключите номер экрана, нажав <АР2><S><1>. Всего доступно 4 экрана, и на каждый Вы можете попробовать вывести информацию, как было описано выше. Однако, если Ваша программа находится в странице 0 или 1 ОЗУ, будьте осторожны: выводимые на экран данные могут «затереть» коды программы. Чтобы этого избежать, разместите свою проверочную программу по адресу ORG = 0F000H, и Вы получите возможность «поиграть» со всеми 4мя экранами.
Аналогично можно проверить работу драйвера в 8-цветном и 16-цветном режимах, а также с широким экраном (номера цветовых режимов нечетные).
Для выхода из программы нажмите «Сброс».
- ВОПРОС 2
- «Работая на 'Орион-128' я заметил, что существующие драйверы клавиатуры не совсем удобны, особенно для среды CP/M-80: коды клавиш управления курсором (да и другие) не соответствуют общепринятым. Изменилось ли что-нибудь в компьютере 'Orion-Pro' ?»
ОТВЕТ 2:
Драйвер клавиатуры в режиме «Orion-Pro» имеет гораздо более широкие возможности, чем в режиме «Orion-128». Эти возможности описаны в документации. Здесь мы коснемся проблемы замены кодов клавиш, генерируемых клавиатурой.
Вариант А. Замена кодов клавиш управления курсором
Пусть необходимо получить следующие коды клавиш курсора:
<влево> - 08H (^H)
<вправо> - 04H (^D)
<вверх> - 05H (^E)
<вниз> - 18H (^X)
<УПР>+<влево> - 01H (^A)
<УПР>+<вправо> - 06H (^F)
<УПР>+<вверх> - 12H (^R)
<УПР>+<вниз> - 03H (^C)
Такая замена выполняется с помощью фрагмента программы:
. . .
LD BC,0408H
LD DE,1805H
LD A,4
CALL 0F806H
;
LD BC,0601H
LD DE 0312H
LD A,6
CALL 0F806H
. . .
При всех последующих вызовах подпрограмм KBRD (0F803H) и INKEY (0F81BH) для указанных клавиш будут формироваться заданные коды.
Вариант B. Настройка функциональных клавиш
Рассмотрим пример, в котором необходимо получить функциональные клавиши со следующими генерируемыми кодами:
<влево> - 08H (^H)
<вправо> - 04H (^D)
<вверх> - 05H (^E)
<вниз> - 18H (^X)
<СТР> - 0BH,04H (^K^D)
<ИСП> - 50H,55H,52H,42H,4FH,0DH,59H ('TURBO')
<K5> - 19H (^Y)
<УПР>+<K5> - 11H,19H (^Q^Y)
<УПР>+<DEL> - 07H (^G)
<SHIFT>+<влево> - 11H,13H (^Q^S)
<SHIFT>+<вправо>- 11H,04H (^Q^D)
<SHIFT>+<вверх> - 11H,12H (^Q^R)
<SHIFT>+<вниз> - 11H,03H (^Q^C)
Настройка функциональных клавиш выполняется с помощью специальных таблиц, которые могут быть размещены в одном из сегментов ОЗУ, например с номером 17 (по адресу 4000H в 4й странице памяти). Приводим фрагмент программы:
. . .
;ЗАКАЧКА ТАБЛИЦ В СЕГМЕНТ 17
IN A,(08H) ;ТЕКУЩАЯ СТРАНИЦА ОЗУ
RLCA
RLCA
RLCA
RLCA
AND 0F0H ;СТРАНИЦА "ОТКУДА"
OR 04H ;СТРАНИЦА "КУДА"
LD HL,TAB1 ;АДРЕС "ОТКУДА"
LD DE,4000H ;АДРЕС "КУДА"
LD BC,TAB4-TAB1 ;ДЛИНА ТАБЛИЦ
CALL 0F833H ;ПЕРЕСЫЛКА (MOVBL)
;
;УСТАНОВКА АДРЕСОВ ТАБЛИЦ ФУНКЦИОНАЛЬНЫХ КЛАВИШ
LD C,17 ;N СЕГМЕНТА
LD HL,4000H ;АДРЕС НАЧАЛА ТАБЛИЦЫ 1
LD A,10
CALL 0F806H
;
LD DE,TAB2-TAB1 ;ДЛИНА ТАБЛИЦЫ 1
ADD HL,DE ;АДРЕС НАЧАЛА ТАБЛИЦЫ 2
LD A,12
CALL 0F806H
;
LD DE,TAB3-TAB2 ;ДЛИНА ТАБЛИЦЫ 2
ADD HL,DE ;АДРЕС НАЧАЛА ТАБЛИЦЫ 3
LD A,14
CALL 0F806H
. . . ;ВЫХОД В ОПЕРАЦИОННУЮ СИСТЕМУ
;ТАБЛИЦА ОДИНОЧНЫХ ФУНКЦИОНАЛЬНЫХ КЛАВИШ
TAB1:DB 7 ;ЧИСЛО КЛАВИШ
DB 4CH,35H,3EH,3DH,40H,27H,2EH ;КОДЫ СКАНИРОВАНИЯ
DB 01H,08H ;<ВЛЕВО>
DB 01H,04H ;<ВПРАВО>
DB 01H,05H ;<ВВЕРХ>
DB 01H,18H ;<ВНИЗ>
DB 01H,19H ;<K5>
DB 02H,0BH,04H ;<СТР>
DB 06H,'TURBO',0DH,'Y' ;<ИСП>
;
;ТАБЛИЦА ФУНКЦИОНАЛЬНЫХ КЛАВИШ ПРИ НАЖАТОЙ <УПР>
TAB2:DB 2
DB 2DH,40H ;КОДЫ СКАНИРОВАНИЯ
DB 01H,07H ;<УПР>+<DEL>
DB 02H,11H,19H ;<УПР>+<K5>
;
;ТАБЛИЦА ФУНКЦИОНАЛЬНЫХ КЛАВИШ ПРИ НАЖАТОЙ <SHIFT>
TAB3:DB 4
DB 4CH,35H,3EH,3DH ;КОДЫ СКАНИРОВАНИЯ
DB 02H,11H,13H ;<SHIFT>+<ВЛЕВО>
DB 02H,11H,04H ;<SHIFT>+<ВПРАВО>
DB 02H,11H,12H ;<SHIFT>+<ВВЕРХ>
DB 02H,11H,03H ;<SHIFT>+<ВНИЗ>
;
TAB4:;КОНЕЦ ТАБЛИЦ
;
. . .
После запуска такой программы функциональные клавиши будут настроены до очередного перезапуска компьютера. Для проверки действия настроенных клавиш можно использовать простую программу, описанную при ответе на Вопрос 1 (вместо подпрограммы 0F809H попробуйте подставить 0F815H).
Функциональные клавиши, установленные по варианту «B», в том числе и клавиши управления курсором, будут действовать только при вызове подпрограммы KBRD (0F803H). Допускается смешанное применение вариантов «A» и «B».
Для «закачки» таблиц функциональных клавиш в приведенном примере использовалась подпрограмма 0F833H, выполняющая пересылку блока кодов из одной страницы памяти в другую. Так как область ОЗУ 0F000H..0FFFFH находится в непереключаемом режиме, то доступ к адресам 3000H..3FFFH в пределах сегментов 3, 7, 11, 15, 19, 23, 27, 31 напрямую невозможен. Данная проблема решается включением указанных сегментов в одном из окон ОЗУ.
В следующей программе для хранения таблиц функциональных клавиш используется часть сегмента 19, начиная с адреса 3000H.
ORG 100H ;КОДЫ ПРОГРАММЫ НЕ ДОЛЖНЫ БЫТЬ В ОКНЕ 1
. . .
;ЗАКАЧКА ТАБЛИЦ В СЕГМЕНТ 19
LD HL,WNDBUF ;АДРЕС БУФЕРА С СОСТОЯНИЕМ ДИСПЕТЧЕРА
PUSH HL
CALL 0F842H ;СОХРАНИТЬ ПОРТЫ ДИСПЕТЧЕРА (RDWIN)
;
IN A,(0AH)
SET 1,A ;ВКЛЮЧИТЬ ОКНО "RAM1"
OUT (0AH),A
;
LD A,19
OUT (05H),A ;УСТАНОВИТЬ НОМЕР СЕГМЕНТА В ОКНЕ
;
LD HL,TAB1 ;"ОТКУДА"
LD DE,7000H ;"КУДА" - СЕГМЕНТ 19 В ОКНЕ 1
LD BC,TAB4-TAB1 ;ДЛИНА ТАБЛИЦ
;
PUSH DE
LDIR ;ПЕРЕСЫЛКА
POP HL ;АДРЕС НАЧАЛА ТАБЛИЦ
;
;УСТАНОВКА АДРЕСОВ ТАБЛИЦ ФУНКЦИОНАЛЬНЫХ КЛАВИШ
LD C,19 ;N СЕГМЕНТА
LD A,10
CALL 0F806H
;
LD DE,TAB2-TAB1
ADD HL,DE
LD A,12
CALL 0F806H
;
LD DE,TAB3-TAB2
ADD HL,DE
LD A,14
CALL 0F806H
;
POP HL ;АДРЕС БУФЕРА С СОСТОЯНИЕМ ДИСПЕТЧЕРА
CALL 0F845H ;ВОССТАНОВИТЬ ПОРТЫ ДИСПЕТЧЕРА (WRWIN)
;
. . .
;
WNDBUF:DS 6 ;БУФЕР ДЛЯ СОХРАНЕНИЯ ПОРТОВ ДИСПЕТЧЕРА
;
Обращаем Ваше внимание на ряд моментов:
- Программист должен следить за тем, чтобы коды программы не попали в открываемое окно памяти.
- Каждая таблица функциональных клавиш должна полностью размещаться в пределах сегмента ОЗУ с учетом длины таблицы и адреса ее начала.
- При вызове вектора 0F806H с номерами функций A=10, A=12, A=14 входное значение адреса HL начала таблицы может указываться как в пределах сегмента, так и в пределах страницы ОЗУ, поскольку два старшие бита адреса не используются. В нашем случае адрес начала первой таблицы в окне 1 равен 7000H, что соответствует адресу 0F000H в пределах страницы 2 или 3000H в пределах сегмента 19.
- ВОПРОС 3
- «Меня не устраивает действие некоторых специальных клавиш (АЛФ, ГРАФ, ФИКС) на клавиатуре МС7007. В 'Орион-128' было лучше. Можно ли это исправить?»
ОТВЕТ 3:
Можно сделать так, чтобы клавиатура МС7007 работала в «старом» режиме аналогично РК-86. Для переключения клавиатуры МС7007 в этот режим достаточно запустить простую программу:
. . .
LD A,1
CALL 0F806H ;E - РЕЖИМ КЛАВИАТУРЫ
SET 7,E ;УСТАНОВКА ПРИЗНАКА "СТАРОГО" РЕЖИМА
LD A,0
CALL 0F806H ;ПЕРЕУСТАНОВИТЬ РЕЖИМ КЛАВИАТУРЫ
. . .
- ВОПРОС 4
- «Как изменить кодировку клавиатуры и дисплея?»
ОТВЕТ 4:
В качестве основной для режима «Orion-Pro» принята альтернативная кодировка. Однако по выбору программиста можно включить КОИ8 или КОИ7. При условии использования стандартного шрифта с матрицей 6x10 пискелей это можно сделать с помощью следующей подпрограммы:
;(A) - НОМЕР КОДИРОВКИ:
; 0 - АЛЬТЕРНАТИВНАЯ
; 1 - КОИ-8
; 2 - КОИ-7/Н2
; 3 - КОИ-7/Н1
SETCOD:
AND 03H
LD B,A
;
LD A,1
CALL 0F806H ;E - РЕЖИМ КЛАВИАТУРЫ
LD A,E
AND 0FCH
OR B
LD E,A ;НОВЫЙ КОД РЕЖИМА
LD A,0
CALL 0F806H ;УСТАНОВИТЬ РЕЖИМ КЛАВИАТУРЫ
;
LD A,12
CALL 0F80FH ;ПОЛУЧИТЬ ТЕКУЩИЙ АДРЕС ЗГ
SET 7,B ;ПРИЗНАК АКТИВИЗАЦИИ ЗГ
LD A,13
CALL 0F80FH ;РАСПАКОВАТЬ СТАНДАРТНЫЙ ШРИФТ
RET
Для проверки работоспособности данной подпрограммы наберите программу:
. . .
X1:CALL 0F803H ;ВВОД СИМВОЛА
CP 4 ;КЛАВИШИ K1-K4 ?
JR NC,X2 ;НЕТ
;
CALL SETCOD ;ИЗМЕНИТЬ КОДИРОВКУ
JR X1
X2:LD C,A
CALL 0F809H ;ВЫВЕСТИ СИМВОЛ
JR X1
Эта программа выводит на экран символ, соответствующий нажатой клавише и переключает кодировку при нажатии клавиш <K1>, <K2>, <K3>, <K4> (соответственно ALT, КОИ8, КОИ7/Н2, КОИ7/Н1).
Если Вы планируете использовать загружаемый (нестандартный) шрифт, то Вам надо позаботиться о создании нескольких соответствующих знакогенераторов для каждого типа кодировки, при этом их можно хранить в отдельных файлах и загружать требуемый файл с помощью специальной программы. Другой возможностью является предварительная загрузка всех используемых знакогенераторов в выбранные сегменты ОЗУ с последующим переключением адреса знакогенератора.
- ВОПРОС 5
- «Как распаковать стандартный шрифт в режиме широких букв?»
ОТВЕТ 5:
Подпрограмма распаковки знакогенератора (функция 13 вектора 0F80FH) формирует стандартный шрифт по указанному адресу. Если заданное значение адреса знакогенератора некорректно (знакогенератор не помещается в сегменте), то распаковка не производится.
Стандартный шрифт с размером знакоместа 6x10 пикселей по умолчанию размещается в сегменте 1FH ОЗУ в пределах адресов 0D000H..D9FFH (1000H..19FFH), однако адрес знакогенератора может быть изменен по усмотрению программиста. Ниже приведен фрагмент программы, выводящей сообщение широкими буквами (с установкой соответствующего курсора) с возвратом к прежнему шрифту. Чтобы восстановить размер курсора, необходимо дополнительно воспользоваться функциями 16, 17, 18, 19 вектора 0F80FH.
. . .
;СОХРАНЕНИЕ ПАРАМЕТРОВ ТЕКУЩЕГО ШРИФТА
LD A,12
CALL 0F80FH ;ПОЛУЧИТЬ АДРЕС ЗНАКОГЕНЕРАТОРА
PUSH BC ;N СЕГМЕНТА
PUSH DE ;ШАГ ШАБЛОНОВ
PUSH HL ;НАЧАЛЬНЫЙ АДРЕС
;
LD A,10
CALL 0F80FH ;ПОЛУЧИТЬ РАЗМЕРЫ СИМВОЛОВ
PUSH BC ;ШАГ ВЫВОДА СИМВОЛОВ
PUSH DE ;РАЗМЕРЫ СИМВОЛОВ
PUSH HL ;СМЕЩЕНИЕ ШАБЛОНА
;
;УСТАНОВКА НОВОГО ШРИФТА
LD B,0C4H ;КОД РАСПАКОВКИ
LD C,16 ;НОМЕР СЕГМЕНТА
LD HL,0 ;АДРЕС В СЕГМЕНТЕ
LD A,13
CALL 0F80FH ;РАСПАКОВКА
;
;ВЫВОД СООБЩЕНИЯ
LD HL,WIDE
CALL 0F818H
CALL 0F803H
;
;ВОЗВРАТ ПРЕЖНЕГО ШРИФТА
POP HL
POP DE
POP BC
LD A,9 ;ВЕРНУТЬ РАЗМЕРЫ СИМВОЛОВ
CALL 0F80FH
;
POP HL
POP DE
POP BC
LD A,11 ;ВЕРНУТЬ АДРЕС ЗГ
CALL 0F80FH
;
. . . ;ВЫХОД В ОПЕРАЦИОННУЮ СИСТЕМУ
;
WIDE:DB 'WIDE LETTERS ',0
;
. . .
- ВОПРОС 6
- «Как установить собственный шрифт?»
ОТВЕТ 6:
Установка нестандартного шрифта может выполняться как в программе пользователя, так и с помощью специальной системной программы, предназначенной для загрузки шрифтов.
В любом случае знакогенератор с шаблонами символов должен быть задан последовательностью байтов с учетом требований, описанных в документации на драйвер «TV-PRO», и занесен в один из сегментов ОЗУ. Кроме того, знакогенератор необходимо «подключить», указав:
а) размеры символа (с помощью функции A=9 вектора 0F80FH):
- D — ширина в пикселях;
- E — высота в пикселях;
- B — шаг вывода символов по X;
- C — шаг вывода символов по Y;
- L — смещение левого столбца битов шаблона в левом столбце байтов;
б) адрес знакогенератора (с помощью функции A=11 вектора 0F80FH):
- C — номер сегмента ОЗУ;
- HL — начальный адрес ЗГ в пределах сегмента или в пределах страницы ОЗУ;
- DE — число байтов между соседними шаблонами в ЗГ (шаг следования шаблонов).
Функции A=10 и A=12 являются обратными по отношению к A=9 и A=11. Используя их, можно включить нужный шрифт только на время работы программы пользователя.
Размеры, шаблон и форма курсора должны устанавливаться отдельно.
- ВОПРОС 7
- «Как изменить форму курсора?»
ОТВЕТ 7:
При использовании стандартного курсора, который формируется функцией распаковки знакогенератора (A=13 в векторе 0F80FH), его форма может варьироваться от черточки до прямоугольника без изменения шаблона (шаблон стандартного курсора состоит из соответствующего числа байтов 0FFH). Данная возможность реализуется с помощью управляющей последовательности ESC 'R',Byte, которая выдается через подпрограмму TVC (0F809H) и изменяет высоту курсора и его смещение по Y (соответственно значения регистров E и C в функциях A=16, A=17).
Программист может установить свой шаблон курсора, исходя из размеров используемого шрифта или по другой причине. Ниже приведен фрагмент программы, устанавливающей курсор в виде рамочки размером 6x8 пикселей (шаблон курсора для примера помещается в сегмент 17 по адресу 4800H):
. . .
;ЗАКАЧКА ШАБЛОНА КУРСОРА В СЕГМЕНТ 17
IN A,(08H) ;ТЕКУЩАЯ СТРАНИЦА ОЗУ
RLCA
RLCA
RLCA
RLCA
AND 0F0H ;СТРАНИЦА "ОТКУДА"
OR 04H ;СТРАНИЦА "КУДА"
LD HL,CUR ;АДРЕС "ОТКУДА"
LD DE,4800H ;АДРЕС "КУДА"
LD BC,8 ;ДЛИНА ШАБЛОНА
CALL 0F833H ;ПЕРЕСЫЛКА (MOVBL)
;
;УСТАНОВКА ПАРАМЕТРОВ ШАБЛОНА КУРСОРА
LD C,17 ;НОМЕР СЕГМЕНТА
LD HL,4800H ;АДРЕС НАЧАЛА ШАБЛОНА
LD A,18
CALL 0F80FH ;УСТАНОВКА АДРЕСА ШАБЛОНА
;
LD BC,0000H ;СМЕЩЕНИЕ КУРСОРА ПО X И Y НА ЭКРАНЕ
LD DE,0608H ;РАЗМЕРЫ КУРСОРА
LD L,2 ;СМЕЩЕНИЕ ШАБЛОНА В ЛЕВОМ СТОЛБЦЕ БАЙТОВ
LD A,16
CALL 0F80FH ;УСТАНОВИТЬ РАЗМЕРЫ КУРСОРА
;
;УСТАНОВКА РЕЖИМА ВЫВОДА КУРСОРА
;(НАЛОЖЕНИЕ ПО ИЛИ С СОХРАНЕНИЕМ ИНФОРМАЦИИ)
LD C,39H ;КОД РЕЖИМА КУРСОРА
LD A,14
CALL 0F80FH
;
CALL 0F803H ;ВВОД СИМВОЛА С МИГАНИЕМ КУРСОРА
. . .
;ШАБЛОН КУРСОРА
CUR:DB 3FH,21H,21H,21H,21H,21H,21H,3FH
;
. . .
- ВОПРОС 8
- «Как сделать так, чтобы количество символов, выводимых на экран по горизонтали и вертикали, было равно заданному?»
ОТВЕТ 8:
Количество символов, которое помещается на экране при выводе с помощью подпрограммы TVC (0F809H), зависит от размеров символов и параметров текущего окна вывода. Соотношения, связывающие эти величины, приведены в документации на драйвер «TV-PRO».
Пусть, например, размеры символов составляют 6x10 пикселей, шаг вывода символов по X и Y равен соответственно 6 и 10. Тогда ширина окна для вывода 80 символов в строке должна быть 6+6*79 = 480 точек, высота окна для вывода 25 строк: 8+24*8 = 200 точек.
Установка окна (должен быть назначен широкий экран 512 точек) может быть выполнена так:
. . .
LD B,200 ;ВЫСОТА ОКНА
LD HL,480 ;ШИРИНА ОКНА
LD DE,16 ;СМЕЩЕНИЕ ОКНА ПО X
LD C,28 ;СМЕЩЕНИЕ ОКНА ПО Y
LD A,16
CALL 0F80CH ;УСТАНОВИТЬ ОКНО
JP C,... ;ОШИБКА ПАРАМЕТРОВ
. . .
Установку окна можно выполнить также, используя подфункцию (4/9) функции (4) в векторе 0F80FH. В этом случае размеры и смещение окна указываются в количестве символов:
. . .
LD H,25 ;ВЫСОТА
LD L,80 ;ШИРИНА
LD D,3 ;СМЕЩЕНИЕ ПО Y
LD E,3 ;СМЕЩЕНИЕ ПО X
LD C,9 ;НОМЕР ПОДФУНКЦИИ
LD A,4 ;НОМЕР ФУНКЦИИ
CALL 0F80FH ;УСТАНОВИТЬ ОКНО
JP C,... ;ОШИБКА ПАРАМЕТРОВ
. . .
Очевидно, что установка вторым способом более удобна, так как вычисление ширины и высоты окна в пикселях выполняется автоматически с учетом размеров символов. Однако, смещение окна по X и по Y в пикселях также зависит от размеров символов, что не всегда удобно.
Можно предложить альтернативный вариант: сначала установить окно с помощью подфункции (4/9) вектора 0F80FH, получить его размеры в пикселях с помощью функции (17) вектора 0F80CH, а затем переустановить окно с теми же размерами, но с требуемыми смещениями по X и по Y путем вызова функции (16) вектора 0F80FH.
Для нашего примера:
. . .
LD H,25 ;ВЫСОТА В СИМВОЛАХ
LD L,80 ;ШИРИНА В СИМВОЛАХ
LD D,0 ;СМЕЩЕНИЕ (ФИКТИВНОЕ)
LD C,9
LD A,4
CALL 0F80FH ;УСТАНОВИТЬ СИМВОЛЬНОЕ ОКНО
JP C,... ;ОШИБКА
;
LD A,17
CALL 0F80CH ;B,HL - РАЗМЕРЫ ОКНА В ПИКСЕЛЯХ
;
LD DE,16 ;СМЕЩЕНИЕ ПО X
LD C,28 ;СМЕЩЕНИЕ ПО Y
LD A,16
CALL 0F80CH ;ПЕРЕУСТАНОВКА ОКНА
JP C,... ;ОШИБКА
. . .
- ВОПРОС 9
- «Как установить окно размером с полный экран?»
ОТВЕТ 9:
Самый простой способ — последовательно вызвать функции получения и установки номера доступного экрана:
. . .
LD A,7
CALL 0F80CH
LD A,6
CALL 0F80CH
. . .
- ВОПРОС 10
- «Могу ли я переключить номер доступного экрана или его режим с сохранением параметров текущего окна?»
ОТВЕТ 10:
Это можно сделать следующим образом:
. . .
LD A,17
CALL 0F80CH ;ПОЛУЧЕНИЕ ПАРАМЕТРОВ ОКНА
PUSH BC
PUSH DE
PUSH HL ;СОХРАНЕНИЕ ПАРАМЕТРОВ
;
LD C,9 ;НОМЕР РЕЖИМА ЭКРАНА
LD A,0
CALL 0F80CH ;УСТАНОВИТЬ РЕЖИМ ДОСТУПНОГО ЭКРАНА
;
POP HL
POP DE
POP BC
;
LD A,16
CALL 0F80CH ;ВЕРНУТЬ ОКНО
. . .
- ВОПРОС 11
- «Каким образом можно сохранить и восстановить окно экрана?»
ОТВЕТ 11:
Это делается с помощью функций A=19,20,21,22,23 вектора 0F80CH.
Процесс распределения буферной памяти для сохранения окон возлагается на программу пользователя: при каждом сохранении окна адрес буфера в пределах сегментов должен увеличиваться на длину сохраняемых данных, а в случае выхода адреса за пределы 0..3FFFH (16 К) должны выбираться очередные свободные сегменты. Количество сегментов, одновременно необходимых для сохранения одного окна (размерность буфера) зависит от числа экранных плоскостей и определяется текущим цветовым режимом доступного экрана.
Может быть предложен следующий порядок вызова функций для сохранения окна:
- Определить адрес начала буфера HL, свободного для сохранения окна, с помощью функции A=20;
- Определить необходимую длину буфера DE для размещения данных с помощью функции A=21;
- Проверить возможность сохранения окна: HL+DE < 4000H;
- Если условие не выполнено, выбрать свободные сегменты и установить адрес начала буфера HL=0 с помощью функции A=19; перейти в начало;
- Сохранить окно путем вызова функции A=22 (без параметров).
- Сохранить параметры текущего окна и адрес буфера — в стеке или специальных ячейках;
- Увеличить адрес начала буфера на длину сохраняемых данных и переустановить его с помощью функции A=19.
Заметим, что пункты 1)4) можно опустить, добавив в конец пункта 5) действия, указанные в пункте 4). Эти действия должны выполняться, если после вызова функции A=22 установлен флаг «CY».
Процесс восстановления последнего сохраненного окна включает следующие пункты:
- Получить параметры последнего сохраненного окна и адрес его буфера — из стека или специальных рабочих ячеек;
- Установить текущее окно с помощью функции A=16;
- Установить адрес буфера с помощью функции A=19;
- Восстановить окно с помощью функции A=23.
Приводим фрагмент демонстрационной программы, выполняющей операции сохранения и восстановления окна без контроля переполнения буфера и без организации стековой структуры.
. . .
LD A,4
LD C,9 ;ПОДФУНКЦИЯ УСТАНОВКИ ОКНА
LD DE,0305H ;СМЕЩЕНИЕ ОКНА
LD HL,0810H ;РАЗМЕРЫ ОКНА
CALL 0F80FH ;УСТАНОВИТЬ ОКНО
;
LD A,22
LD C,0 ;БЕЗ СДВИГА БУФЕРА
CALL 0F80CH ;СОХРАНИТЬ ОКНО
;
LD A,18
CALL 0F80CH ;ОЧИСТИТЬ ОКНО
;
CALL 0F803H
;
LD A,23
LD C,0 ;БЕЗ СДВИГА БУФЕРА - НА ТО ЖЕ МЕСТО
CALL 0F80CH ;ВОССТАНОВИТЬ ОКНО
;
CALL 0F803H
. . .
- ВОПРОС 12
- «Каким образом изменить цвет отображаемых данных ?»
ОТВЕТ 12:
Для управления цветом в текущем цветовом режиме используются функции A=11,12,13,14,15,16 вектора 0F80CH, причем две последние управляют аппаратной палитрой видимого экрана, а остальные — цветами данных, формируемых в доступном экране.
Рассмотрим пример, показывающий, как назначить 4-цветный режим доступного и видимого экранов с установкой белых символов на синем фоне:
. . .
LD A,8
CALL 0F80CH ;ОТКЛЮЧИТЬ ВИДЕОСИГНАЛ
;
LD C,4 ;КОД РЕЖИМА
LD A,0
CALL 0F80CH ;УСТАНОВИТЬ РЕЖИМ ДОСТУПНОГО ЭКРАНА
LD A,2
CALL 0F80CH ;УСТАНОВИТЬ РЕЖИМ ВИДИМОГО ЭКРАНА
;
LD C,1 ;КОД ПАЛИТРЫ
LD A,14
CALL 0F80CH ;УСТАНОВИТЬ ПАЛИТРУ
;
LD C,1 ;ЦВЕТ ФОНА - СИНИЙ
LD A,10
CALL 0F80CH ;УСТАНОВИТЬ ЦВЕТ ФОНА
;
LD C,0 ;ЦВЕТ ИЗОБРАЖЕНИЯ - БЕЛЫЙ
LD A,12
CALL 0F80CH ;УСТАНОВИТЬ ЦВЕТ ИЗОБРАЖЕНИЯ
;
LD A,18
CALL 0F80CH ;ОЧИСТИТЬ ОКНО
;
LD A,9
CALL 0F80CH ;ВКЛЮЧИТЬ ВИДЕОСИГНАЛ
;
LD HL,TEXT
CALL 0F818H ;ВЫВОД СООБЩЕНИЯ
CALL 0F803H
. . .
TEXT:DB 'БЕЛОЕ НА СИНЕМ ',1BH,'F03'
DB 'КРАСНОЕ НА БЕЛОМ ',1BH,'F32'
DB 'ЗЕЛЕНОЕ НА КРАСНОМ ',0
. . .
- ВОПРОС 13
- «Как изменить режим вывода символов?»
ОТВЕТ 13:
Режим вывода символов можно изменить последовательным выводом функций A=8, A=7 вектора 0F80FH, скорректировав требуемые разряды регистра (C). Например, для запрета скроллинга окна можно поступить так:
. . .
LD A,8
CALL 0F80FH ;ПОЛУЧИТЬ РЕЖИМ ВЫВОДА В РЕГИСТРЕ (C)
RES 6,C ;СБРОСИТЬ БИТ 6
LD A,7
CALL 0F80FH ;УСТАНОВИТЬ НОВЫЙ РЕЖИМ
. . .
Для установки режима наложения символов, например по «OR», над значением регистра (C) в промежутке между вызовами функций (8) и (7) необходимо выполнить следующие операции:
. . .
RES 1,C
SET 0,C
. . .
- ВОПРОС 14
- «Как пользоваться функциями вектора вывода графики?»
ОТВЕТ 14:
Функции вектора 0F82AH используются аналогично функциям других векторов 'TV-PRO'.
Пример вывода окружности:
. . .
LD BC,128 ;Y
LD DE,192 ;X
LD H,80H ;РАДИУС ПО X
LD L,3 ;КОД ЦВЕТА
LD A,15
CALL 0F82AH ;ВЫВОД ОКРУЖНОСТИ
. . .
- ВОПРОС 15
- «Как пользоваться драйвером мыши?»
ОТВЕТ 15:
В таблице векторов BIOS имеется два вектора обслуживания мыши:
- 0F84EH — опрос порта мыши;
- 0F851H — управление мышью.
Подпрограмма 0F851H - многофункциональная и обеспечивает пользователя минимальным набором средств для работы с мышью. Основная функция данной подпрограммы — перемещение указателя мыши в пределах окна экрана до нажатия одной из ее кнопок (номер функции: A=0). Эта функция вызывает вектор 0F84EH определения состояния мыши.
Остальные функции подпрограммы 0F851H (с номерами A=1.. A=10) введены для поддержки функции A=0 и позволяют изменять режим отображения указателя мыши, его форму, размеры, шаг перемещения, а также проверять факт попадания координат указателя мыши в одну из заданных областей экрана.
Приведем пример совместного использования функций A=0 и A=10:
. . .
LD BC,0 ;НАЧАЛЬНЫЕ КООРДИНАТЫ МЫШИ
LD DE,0
;
CYC:LD A,0
CALL 0F851H ;ОТОБРАЗИТЬ И ПЕРЕМЕЩАТЬ МЫШЬ
JP C,... ;ОШИБКА: X,Y ВНЕ ОКНА ИЛИ ПЕРЕПОЛН. БУФЕРА
;
BIT 6,A ;НАЖАТА ПРАВАЯ КНОПКА ?
JP NZ,... ;ДА - ВЫХОД ИЗ ПРОГРАММЫ
;
;ПОИСК X,Y В ТАБЛИЦЕ ОБЪЕКТОВ
LD HL,TAB ;АДРЕС ТАБЛИЦЫ
LD A,10
CALL 0F851H ;ПОИСК
JR C,CYC ;НЕ НАШЛИ
;
CALL 0F815H ;ОТОБРАЗИТЬ НОМЕР ОБЪЕКТА
JR CYC
;
;ОПИСАНИЕ ТАБЛИЦЫ ОБЪЕКТОВ
TAB:DB [ EOFTAB - TAB - 1 ] / 6 ;ЧИСЛО ОБЪЕКТОВ
;
;ОПИСАНИЕ ОБЪЕКТА 0
DW 0 ;X1
DB 0 ;Y1
DW 10 ;DX1
DB 10 ;DY1
;
;ОПИСАНИЕ ОБЪЕКТА 1
DW 384-10 ;X2
DB 256-10 ;Y2
DW 10 ;DX2
DB 10 ;DY2
EOFTAB:
;КОНЕЦ ТАБЛИЦЫ
;
Для формирования указателя мыши при вызове функции A=0 используются функции обслуживания курсора драйвера 'TV-PRO'. Ниже приводится пример подпрограммы, выполняющей отображение и перемещение указателя мыши примерно также, как это сделано в функции A=0 вектора 0F851H. Используя этот пример, Вы сможете написать свою подпрограмму вывода и перемещения указателя мыши, исходя из конкретных требований.
;
;-- ВЫВОД УКАЗАТЕЛЯ МЫШИ И ПЕРЕМЕЩЕНИЕ --
;НА ВХОДЕ:
; BC = Y, DE = X
;НА ВЫХОДЕ:
; "CY" - УКАЗАТЕЛЬ МЫШИ НАХОДИЛСЯ ВНЕ ОКНА, ИЛИ БУФЕР
; СОХРАНЕНИЯ ИНФОРМАЦИИ ЭКРАНА ПЕРЕПОЛНЕН
; ИНАЧЕ:
; BC = Y, DE = X
; A - КОД НАЖАТОЙ КНОПКИ:
; 80H - ЛЕВАЯ КНОПКА,
; 40H - ПРАВАЯ КНОПКА;
;ОСОБЕННОСТЬ:
; ИСПОЛЬЗУЮТСЯ 28 БАЙТ ДЛЯ РАБОЧИХ ЯЧЕЕК MS1..MS14.
MSWND:
LD (MS1),BC ;СОХРАНИТЬ ИСХОДНЫЕ X,Y
LD (MS2),DE
PUSH HL ;#### СОХРАНИТЬ HL
;
;СОХРАНЕНИЕ И ПЕРЕУСТАНОВКА ПАРАМЕТРОВ ОКНА
CALL 0F81EH ;СОХР.ПОЗ.КУРСОРА ПЕРЕД ПЕРЕУСТ.ОКНА
PUSH HL ;###
;
LD A,17
CALL 0F80CH ;ПОЛУЧИТЬ ПАРАМЕТРЫ ОКНА
;
PUSH BC ;## СОХРАНИТЬ ПАРАМЕТРЫ ОКНА
PUSH DE
PUSH HL
;
LD A,5
CALL 0F80CH ;ПОЛУЧИТЬ НОМЕР ЭКРАНА -> (C)
;
PUSH BC
LD A,2
CALL 0F851H ;ПОЛУЧИТЬ РЕЖИМ МЫШИ -> (C)
BIT 7,C ;"NZ" - МЫШЬ НА ВЕСЬ ЭКРАН
POP BC ;НОМЕР ДОСТУПНОГО ЭКРАНА
;
LD A,4 ;ПЕРЕУСТАНОВИТЬ N ЭКРАНА
CALL NZ,0F80CH ;(УСТАНОВКА ОКНА НА ВЕСЬ ЭКРАН)
;
;СОХРАНЕНИЕ ПАРАМЕТРОВ КУРСОРА
LD A,15
CALL 0F80FH ;ПОЛУЧИТЬ РЕЖИМ КУРСОРА -> (C)
LD H,C
;
LD A,17
CALL 0F80FH ;ПОЛУЧИТЬ РАЗМЕРЫ КУРСОРА
;
LD (MS3),BC ;СОХРАНИТЬ РАЗМЕРЫ И РЕЖИМ КУРСОРА
LD (MS4),DE
LD (MS5),HL
;
LD A,19
CALL 0F80FH ;АДРЕС ШАБЛОНА КУРСОРА
;
LD (MS6),BC
LD (MS7),HL ;СОХРАНИТЬ АДРЕС ШАБЛОНА КУРСОРА
;
LD A,21
CALL 0F80FH ;ПОЛУЧИТЬ АДРЕС БУФЕРА СОХР.ДЛЯ КУРСОРА
;
LD (MS8),BC ;СОХРАНИТЬ
LD (MS9),DE
LD (MS10),HL
;
;УСТАНОВКА ПАРАМЕТРОВ СТРЕЛКИ МЫШИ
LD A,2
CALL 0F851H ;ПОЛУЧИТЬ РЕЖИМ МЫШИ
;
LD A,14
CALL 0F80FH ;УСТАНОВИТЬ НОВЫЙ РЕЖИМ КУРСОРА
;
LD A,4
CALL 0F851H ;ПОЛУЧИТЬ РАЗМЕРЫ МЫШИ
PUSH BC ;# СОХРАНИТЬ ШАГ ПЕРЕМЕЩЕНИЯ МЫШИ
;
LD A,16
LD BC,0
CALL 0F80FH ;УСТАНОВИТЬ НОВЫЕ РАЗМЕРЫ КУРСОРА
;
LD A,6
CALL 0F851H ;ПОЛУЧИТЬ АДРЕС ШАБЛОНА МЫШИ
;
LD A,18
CALL 0F80FH ;УСТАНОВИТЬ НОВЫЙ АДРЕС ШАБЛОНА КУРСОРА
;
LD A,8
CALL 0F851H ;ПОЛУЧИТЬ АДРЕС БУФЕРА СОХР.ДЛЯ МЫШИ
;
LD A,20
CALL 0F80FH ;УСТАНОВИТЬ НОВЫЙ АДРЕС БУФЕРА КУРСОРА
;
POP HL ;# ШАГ ПЕРЕМЕЩЕНИЯ УКАЗАТЕЛЯ МЫШИ
;
;ВЫЧИСЛЕНИЕ ШАГОВ ПРИРАЩЕНИЯ КООРДИНАТ
PUSH HL
LD H,0
LD (MS11),HL ;ШАГ ПО Y
LD A,L
DEC H
NEG
LD L,A
LD (MS12),HL ; - ШАГ ПО Y
POP HL
;
LD L,H ;H=L=ШАГ ПО X
LD H,0
LD (MS13),HL ;ШАГ ПО X
LD A,L
DEC H
NEG
LD L,A
LD (MS14),HL ; - ШАГ ПО X
;
;ОТОБРАЖЕНИЕ УКАЗАТЕЛЯ МЫШИ
LD BC,(MS1)
LD DE,(MS2)
;
LD A,2
CALL 0F80FH
JR NC,MSW1 ;НОРМА
;
;ВНЕ ОКНА ИЛИ ПЕРЕПОЛНЕНИЕ БУФЕРА
LD A,3
CALL 0F80FH ;ПОГАСИТЬ УКАЗАТЕЛЬ
STC
JR MSW7 ;ВЫХОД, "CY"=1 - ПРИЗНАК ОШИБКИ
;
;ОЖИДАНИЕ ОТПУСКАНИЯ КНОПОК MOUSE
MSW1:CALL 0F84EH ;ОПРОС ПОРТА МЫШИ
BIT 4,A ;ЛЕВАЯ КНОПКА
JR Z,MSW1
BIT 5,A ;ПРАВАЯ КНОПКА
JR Z,MSW1
;
;ДВИЖЕНИЕ МЫШИ ДО НАЖАТИЯ ЛЮБОЙ КНОПКИ
MSW2:CALL 0F84EH ;ОПРОС ПОРТА МЫШИ
AND 3FH
CP 3FH
JR Z,MSW2 ;НЕТ ИЗМЕНЕНИЙ
;
PUSH AF
LD A,3
CALL 0F80FH ;ПОГАСИТЬ УКАЗАТЕЛЬ МЫШИ
POP AF
;
LD L,A ;БАЙТ МЫШИ
AND 30H
CP 30H
JR NZ,MSW4 ;НАЖАТА ХОТЯ БЫ ОДНА КНОПКА
;
LD A,L
LD (MS1),BC ;СОХРАНИТЬ ТЕКУЩИЕ X,Y
LD (MS2),DE
;
BIT 0,A
CALL Z,MSW8 ;ВЛЕВО
BIT 1,A
CALL Z,MSW9 ;ВПРАВО
BIT 2,A
CALL Z,MSW10 ;ВНИЗ
BIT 3,A
CALL Z,MSW11 ;ВВЕРХ
;
LD A,2
CALL 0F80FH ;ОТОБРАЗИТЬ МЫШЬ
JR NC,MSW2 ;В ОКНЕ (НОРМА)
;
;ВЫХОД ЗА ПРЕДЕЛЫ ОКНА
LD BC,(MS1)
LD DE,(MS2) ;ВОССТАНОВИТЬ ПРЕЖНИЕ X,Y
;
LD A,2
CALL 0F80FH ;ОТОБРАЗИТЬ МЫШЬ НА СТАРОМ МЕСТЕ
JR MSW2
;
MSW4:XOR A ;ФОРМИРОВАНИЕ КОДА НАЖАТЫХ КНОПОК
BIT 4,L
JR NZ,MSW5
SET 7,A
MSW5:BIT 5,L
JR NZ,MSW6
SET 6,A
MSW6:OR A ;"NC"
;
;ВОССТАНОВЛЕНИЕ ПАРАМЕТРОВ КУРСОРА
MSW7:PUSH AF
LD BC,(MS8)
LD DE,(MS9)
LD HL,(MS10)
LD A,20
CALL 0F80FH ;АДРЕС БУФЕРА КУРСОРА
;
LD BC,(MS6)
LD DE,(MS7)
LD A,18
CALL 0F80FH ;АДРЕС ШАБЛОНА КУРСОРА
;
LD BC,(MS3)
LD DE,(MS4)
LD HL,(MS5)
LD A,16
CALL 0F80FH ;РАЗМЕРЫ КУРСОРА
;
LD C,H
LD A,14
CALL 0F80FH ;РЕЖИМ КУРСОРА
;
POP AF
;
POP HL ;## ПАРАМЕТРЫ ИСХОДНОГО ОКНА
POP DE
POP BC
;
PUSH AF
LD A,16
CALL 0F80CH ;ВЕРНУТЬ ОКНО
POP AF
;
POP HL ;### КООРДИНАТЫ КУРСОРА
;
PUSH AF
CALL 0F83CH ;ВЕРНУТЬ ПОЗИЦИЮ КУРСОРА
POP AF
;
POP HL ;#### ВЕРНУТЬ HL
;
LD BC,(MS1) ;ВЫХОДНЫЕ X,Y
LD DE,(MS2)
RET
;
;МЫШЬ ВЛЕВО
MSW8:LD HL,(MS14) ; - ШАГ ПО X
ADD HL,DE
EX DE,HL
RET
;
;МЫШЬ ВПРАВО
MSW9:LD HL,(MS13) ;ШАГ ПО X
ADD HL,DE
EX DE,HL
RET
;
;МЫШЬ ВНИЗ
MSW10:LD HL,(MS11) ;ШАГ ПО Y
ADD HL,BC
LD B,H
LD C,L
RET
;
;МЫШЬ ВВЕРХ
MSW11:LD HL,(MS12) ; - ШАГ ПО Y
ADD HL,BC
LD B,H
LD C,L
RET
;
;ВРЕМЕННЫЕ ЯЧЕЙКИ
MS1:DS 2
MS2:DS 2
MS3:DS 2
. . .
MS13:DS 2
MS14:DS 2
;
;
- ВОПРОС 16
- «Меня не устраивают управляющие коды и ESC-последовательности драйвера 'TV-PRO'. Могу ли я их изменить?»
ОТВЕТ 16:
Для изменения действия управляющих кодов и последовательностей необходимо написать новую подпрограмму обработки вектора 0F809H. Ниже приведен пример такой подпрограммы, которая основана на использовании функции (0) вектора 0F80FH и имеет практически такое же быстродействие.
Данная подпрограмма реализует все управляющие коды и ESC-последовательности, имеющиеся в стандартном варианте 0F809H, за исключением ESC 'A'..'D' (перемещение курсора). Управляющая последовательность ESC ':' работает подругому: она включает отображение курсора только в подпрограмме KBRD (0F803H), так как режим непрерывного вывода курсора не реализован. Добавлена последовательность ESC 'W',Y,X,dY,dX для установки символьного окна экрана.
Перед применением описываемой подпрограммы должны быть выполнены следующие установки:
1). Значение бита 4 в байте режима вывода символов должно быть нулевым, то есть обработка управляющих кодов в функции (0) запрещена:
. . .
LD A,8
CALL 0F80FH ;C - РЕЖИМ ВЫВОДА СИМВОЛОВ
RES 4,C
LD A,7
CALL 0F80FH ;ПЕРЕУСТАНОВИТЬ РЕЖИМ
. . .
Данное условие необходимо для обработки управляющего кода ^P (10H).
2). Значение бита 6 в байте режима вывода курсора должно быть нулевым, то есть непрерывный вывод курсора в функции (0) отключен:
. . .
LD A,15
CALL 0F80FH ;C - РЕЖИМ ВЫВОДА КУРСОРА
RES 6,C
LD A,14
CALL 0F80FH ;ПЕРЕУСТАНОВИТЬ РЕЖИМ
. . .
При невыполнении этого условия «непрерывный» курсор будет выводиться неправильно, так как на момент изменения координат и формы курсора он должен удаляться, что обеспечивается внутри функции (0) при единичном значении бита 6.
В случае необходимости режим непрерывного отображения курсора может быть реализован с использованием функций (2), (3) вектора 0F80CH при соблюдении условия 2).
0F809H:JP XXXX
;ВХОД В ВЕКТОР TVC
. . .
;
;== НОВАЯ ПОДПРОГРАММА ОБРАБОТКИ ВЕКТОРА 0F809H ==
; (С ИСПОЛЬЗОВАНИЕМ ФУНКЦИИ (0) ВЕКТОРА 0F80FH)
XXXX:
PUSH AF
PUSH BC
PUSH DE
PUSH HL
;
LD B,C ;КОД СИМВОЛА
LD HL,AR2ST
LD A,(HL)
OR A
JP M,TVC01 ;ПРИЗНАК ^P - ВЫВЕСТИ СИМВОЛ 00..1FH
JP NZ,TVC11 ;ОБРАБОТКА ESC - ПОСЛЕДОВАТЕЛЬНОСТИ
;
LD A,C ;КОД СИМВОЛА
CP 20H
JR C,TVC03 ;УПРАВЛЯЮЩИЙ СИМВОЛ
;
TVC01:RES 7,(HL) ;СБРОС ПРИЗНАКА ^P
;
XOR A ;ФУНКЦИЯ 0
CALL 0F80FH ;ВЫВОД СИМВОЛА В ПОЗИЦИЮ КУРСОРА
;
CALL NC,UNDERL ;ПОДЧЕРКИВАНИЕ
TVC02:
POP HL
POP DE
POP BC
POP AF
RET
;
;
;- ЧАСТНАЯ П/П ПОДЧЕРКИВАНИЯ КУРСОРОМ -
UNDERL:LD A,(UNDRL)
OR A ;РЕЖИМ ПОДЧЕРКИВАНИЯ ?
RET Z ;НЕТ
;
LD A,15
CALL 0F80FH ;C - РЕЖИМ ВЫВОДА КУРСОРА
PUSH BC
;
LD A,8
CALL 0F80FH ;C - РЕЖИМ ВЫВОДА СИМВОЛОВ
LD A,C
AND 07H
LD C,A
CALL TVC21 ;УСТАНОВИТЬ НОВЫЙ РЕЖИМ ВЫВОДА КУРСОРА
;
LD A,4
LD C,1
CALL 0F80FH ;КУРСОР ВЛЕВО
LD A,6
CALL 0F80FH ;BC=Y, DE=X КУРСОРА
LD A,2
CALL 0F80FH ;ВЫВЕСТИ КУРСОР
LD A,4
LD C,2
CALL 0F80FH ;КУРСОР ВПРАВО
;
POP BC
JP TVC21 ;ВЕРНУТЬ РЕЖИМ КУРСОРА
;
;
;ОБРАБОТКА УПРАВЛЯЮЩИХ ФУНКЦИЙ
TVC03:LD DE,TVC02
PUSH DE ;АДРЕС ВОЗВРАТА
;
SUB 07H ;CP 07H
JR NZ,TVC04
;
;BELL
LD BC,300 ;MS
LD DE,2048 ;HZ
JP 0F83FH ;SOUND
;
TVC04:LD DE,TVC06 ;АДРЕС П/П ВЫПОЛНЕНИЯ УПР.ФУНКЦИЙ
PUSH DE
DEC A ;CP 08H
LD C,1
RET Z ;LEFT
;
DEC A ;CP 09H
LD C,5
RET Z ;TAB
;
DEC A ;CP 0AH
LD C,7
RET Z ;LF
;
DEC A
DEC A ;CP 0CH
JR NZ,TVC07
;
;CLS+HOME
POP DE ;БАЛАНС СТЕКА
TVC05:LD C,10 ;CLS
CALL TVC06
LD C,0 ;HOME
;
TVC06:LD A,4 ;ФУНКЦИЯ 4 - УПРАВЛЕНИЕ НОМЕР (C)
JP 0F80FH
;
TVC07:DEC A ;CP 0DH
LD C,6
RET Z ;CR
;
SUB 3 ;CP 10H = ^P
JR NZ,TVC08
;
;ПРЕФИКС УПРАВЛЯЮЩИХ СИМВОЛОВ
POP DE
SET 7,(HL)
RET
;
TVC08:SUB 08H ;CP 18H
LD C,2
RET Z ;RIGHT
;
DEC A ;CP 19H
LD C,3
RET Z ;UP
;
DEC A ;CP 1AH
LD C,4
RET Z ;DOWN
;
POP DE ;БАЛАНС СТЕКА
DEC A ;CP 1BH
JR Z,TVC09 ;ESC
;
SUB 04H ;CP 1FH
RET NZ
;
;CLS+HOME
JR TVC05
;
TVC09:INC (HL) ;УСТАНОВИТЬ ПРИЗНАК ESC
RET
;
;КОНЕЦ ESC - ПОСЛЕДОВАТЕЛЬНОСТИ
TVC10:XOR A
LD (AR2ST),A
JP TVC02
;
;ОБРАБОТКА АР2-КОМАНД
TVC11:LD DE,TVC10
PUSH DE
;
INC (HL)
DEC A ;1-Й СИМВОЛ ПОСЛЕ АР2 ?
JP NZ,TVC28
;
;ОБРАБОТКА 1-ГО СИМВОЛА ПОСЛЕ АР2
LD A,8
CALL 0F80FH ;C - РЕЖИМ ВЫВОДА СИМВОЛОВ
LD A,B ;КОД СИМВОЛА
LD (AR2CD),A
;
SUB '2' ;CP '2'
JR NZ,TVC13
;
;ВКЛЮЧИТЬ АВТОПЕРЕВОД СТРОКИ
SET 5,C
;
;УСТАНОВКА РЕЖИМА ВЫВОДА СИМВОЛОВ (C)
TVC12:LD A,7
JP 0F80FH
;
TVC13:DEC A ;CP '3'
JR NZ,TVC14
;
;ВЫКЛЮЧИТЬ АВТОПЕРЕВОД
RES 5,C
JR TVC12
;
TVC14:DEC A ;CP '4'
JR NZ,TVC15
;
;РАЗРЕШЕНИЕ СКРОЛЛИНГА
SET 6,C
JR TVC12
;
TVC15:DEC A ;CP '5'
JR NZ,TVC16
;
;ЗАПРЕТ СКРОЛЛИНГА
RES 6,C
JR TVC12
;
TVC16:DEC A ;CP '6'
JR NZ,TVC17
;
;ВКЛЮЧИТЬ ИНВЕРСИЮ
SET 2,C
JR TVC12
;
TVC17:DEC A ;CP '7'
JR NZ,TVC18
;
;ВЫКЛЮЧИТЬ ИНВЕРСИЮ
RES 2,C
JR TVC12
;
TVC18:DEC A ;CP '8'
JR NZ,TVC19
;
;ВКЛЮЧИТЬ ПОДЧЕРКИВАНИЕ КУРСОРОМ
LD A,0FFH
LD (UNDRL),A
RET
;
TVC19:DEC A ;CP '9'
JR NZ,TVC20
;
;ВЫКЛЮЧИТЬ ПОДЧЕРКИВАНИЕ
XOR A
LD (UNDRL),A
RET
;
TVC20:PUSH AF
LD A,15
CALL 0F80FH ;ПОЛУЧИТЬ РЕЖИМ ВЫВОДА КУРСОРА (C)
POP AF
;
DEC A ;CP ':'
JR NZ,TVC22
;
;ВКЛЮЧИТЬ КУРСОР
SET 5,C
;
TVC21:LD A,14
JP 0F80FH ;РЕЖИМ КУРСОРА
;
TVC22:DEC A ;CP ';'
JR NZ,TVC23
;
;ВЫКЛЮЧИТЬ КУРСОР
RES 5,C
JR TVC21
;
TVC23:DEC A ;CP '<'
JR NZ,TVC24
;
;ВКЛЮЧИТЬ МИГАНИЕ КУРСОРА
SET 4,C
JR TVC21
;
TVC24:DEC A ;CP '='
JR NZ,TVC25
;
;ВЫКЛЮЧИТЬ МИГАНИЕ КУРСОРА
RES 4,C
JR TVC21
;
TVC25:SUB 'E'-'=' ;CP 'E'
LD C,10
JP Z,TVC06 ;CLS
;
DEC A ;CP 'F'
JR Z,TVC27
;
DEC A
DEC A ;CP 'H'
LD C,0
JP Z,TVC06 ;HOME
;
DEC A
DEC A ;CP 'J'
LD C,11
JP Z,TVC06 ;ОЧИСТИТЬ ДО КОНЦА ОКНА
;
INC C
DEC A ;CP 'K'
JP Z,TVC06 ;ДО КОНЦА СТРОКИ
;
DEC A ;CP 'L'
LD C,15
JP Z,TVC06 ;ВСТАВКА
;
INC C
DEC A ;CP 'M'
JP Z,TVC06 ;УДАЛЕНИЕ
;
LD DE,TVC27
PUSH DE
;
SUB 'R'-'M' ;CP 'R'
RET Z
;
DEC A ;CP 'S'
RET Z
;
DEC A ;CP 'T'
RET
;
DEC A ;CP 'U'
RET
;
DEC A ;CP 'V'
RET
;
DEC A ;CP 'W'
RET
;
SUB 'Y'-'W' ;CP 'Y'
RET Z
;
POP DE
RET
;
;КОНЕЦ ОБРАБОТКИ 1-ГО СИМВОЛА
TVC27:POP HL
JP TVC02
;
TVC28:DEC A
JR NZ,TVC36
;
;2-Й СИМВОЛ ПОСЛЕ АР2
LD A,(AR2CD)
SUB 'R' ;CP 'R'
JR NZ,TVC29
;
;УСТАНОВКА ТОЛЩИНЫ КУРСОРА
LD H,B ;ЗАДАННАЯ ТОЛЩИНА
LD A,17
CALL 0F80FH ;C-СМЕЩЕНИЕ,E-ВЫСОТА КУРСОРА
LD A,C
ADD A,E
RET C
SUB H ;НОВОЕ СМЕЩЕНИЕ
RET C
LD C,A
LD E,H
LD A,16
JP 0F80FH ;УСТАНОВИТЬ НОВЫЕ РАЗМЕРЫ КУРСОРА
;
TVC29:DEC A ;CP 'S'
JR NZ,TVC30
;
;УСТАНОВКА НОМЕРА ЭКРАНА
LD C,B
LD A,4
CALL 0F80CH
LD A,6
JP 0F80CH
;
TVC30:DEC A ;CP 'T'
JR NZ,TVC31
;
LD C,B
LD A,14
JP 0F80CH ;УСТАНОВКА ПАЛИТРЫ
;
TVC31:DEC A ;CP 'U'
JR NZ,TVC32
;
;УСТАНОВКА РЕЖИМА ЭКРАНОВ
LD C,B
XOR A
CALL 0F80CH
LD A,2
JP 0F80CH
;
TVC32:DEC A ;CP 'V'
JR NZ,TVC33
;
;ВКЛЮЧИТЬ/ВЫКЛЮЧИТЬ ВИДЕО
LD A,B
RRCA
LD A,9
JP C,0F80CH ;ON
DEC A
JP 0F80CH ;OFF
;
TVC33:POP HL
LD HL,TVC02
PUSH HL
;
ADD A,'V'-'F' ;CP 'F'
JR NZ,TVC34
;
LD A,10
LD C,B
JP 0F80CH ;УСТАНОВИТЬ ЦВЕТ ФОНА
;
TVC34:SUB 'W'-'F' ;CP 'W'
JR NZ,TVC35
;
LD A,B
LD (Y),A ;СМЕЩЕНИЕ ОКНА ПО Y
RET
;
TVC35:SUB 'Y'-'W' ;CP 'Y'
RET NZ
;
LD A,B
SUB 20H ;Y КУРСОРА
LD (Y),A
RET
;
TVC36:DEC A
JR NZ,TVC39
;
;3-Й СИМВОЛ ПОСЛЕ АР2
LD A,(AR2CD)
;
CP 'F'
JR NZ,TVC37
;
LD A,12
LD C,B
JP 0F80CH ;УСТАНОВКА ЦВЕТА ИЗОБРАЖЕНИЯ
;
TVC37:CP 'W'
JR NZ,TVC38
;
LD A,B
LD (X),A ;СМЕЩЕНИЕ ОКНА ПО X
TVC26:POP HL
JP TVC02
;
TVC38:CP 'Y'
RET NZ
;
LD A,B
SUB 20H ;X КУРСОРА
LD L,A
LD A,(Y)
LD H,A
JP 0F83CH ;УСТАНОВИТЬ КУРСОР
;
TVC39:DEC A
JR NZ,TVC40
;
;4-Й СИМВОЛ ПОСЛЕ АР2
LD A,B
LD (DY),A ;ВЫСОТА ОКНА
JR TVC26
;
TVC40:DEC A
RET NZ
;
LD DE,(X) ;E=X, D=Y - СМЕЩЕНИЕ ОКНА
LD A,(DY)
LD H,A ;ВЫСОТА ОКНА
LD L,B ;ШИРИНА ОКНА
LD C,9
JP TVC06 ;УСТАНОВИТЬ ОКНО
;
;
;--- РАБОЧИЕ ЯЧЕЙКИ ---
AR2ST:DB 0 ;СЧЕТЧИК СИМВОЛОВ ESC
AR2CD:DB 0 ;КОД КОМАНДЫ ESC
X:DB 0 ;СМЕЩЕНИЕ ОКНА ПО X
Y:DB 0 ;СМЕЩЕНИЕ ОКНА ПО Y / КООРДИНАТА Y КУРСОРА
DY:DB 0 ;ВЫСОТА ОКНА
UNDRL:DB 0 ;ПРИЗНАК ПОДЧЕРКИВАНИЯ
;
;
Подпрограмма обработки вектора 0F809H может быть создана на основе функции (1) вектора 0F80FH, при этом состояние бита 4 в байте режима вывода символов и бита 6 в байте режима вывода курсора не имеют значения.
Ниже приведен начальный фрагмент такой подпрограммы (остальная часть аналогична предыдущему примеру). Быстродействие данной подпрограммы примерно в 1.2 раза хуже из-за использования функции (6) для получения координат курсора и функции (4) для перемещения курсора вправо. Устранить этот недостаток можно, если написать свои процедуры получения, установки и изменения координат курсора, отказавшись от функций (4), (5), (6).
. . .
;
;== НОВАЯ ПОДПРОГРАММА ОБРАБОТКИ ВЕКТОРА 0F809H ==
; (С ИСПОЛЬЗОВАНИЕМ ФУНКЦИИ (1) ВЕКТОРА 0F80FH)
XXXX:
PUSH AF
PUSH BC
PUSH DE
PUSH HL
;
LD B,C ;КОД СИМВОЛА
LD HL,AR2ST
LD A,(HL)
OR A
JP M,TVC01 ;ПРИЗНАК ^P - ВЫВЕСТИ СИМВОЛ 00..1FH
JP NZ,TVC11 ;ОБРАБОТКА ESC - ПОСЛЕДОВАТЕЛЬНОСТИ
;
LD A,C ;КОД СИМВОЛА
CP 20H
JR C,TVC03 ;УПРАВЛЯЮЩИЙ СИМВОЛ
;
TVC01:RES 7,(HL) ;СБРОС ПРИЗНАКА ^P
;
PUSH BC ;(C) - В СТЕК
LD A,6
CALL 0F80FH ;BC=Y, DE=X
POP HL ;(L) - КОД СИМВОЛА
LD A,1
CALL 0F80FH ;ВЫВОД СИМВОЛА В ПОЗИЦИЮ BC,DE
;
CALL NC,UNDERL ;ПОДЧЕРКИВАНИЕ, ЕСЛИ В ОКНЕ
LD A,4
LD C,2
CALL 0F80FH ;КУРСОР ВПРАВО
JR NC,TVC02 ;СКРОЛЛИНГ НЕ НУЖЕН
;
LD C,3
CALL TVC06 ;ВВЕРХ => В НАЧАЛО ПОСЛЕДНЕЙ СТРОКИ
LD C,7
CALL TVC06 ;ПС
TVC02:
POP HL
POP DE
POP BC
POP AF
RET
;
;
;- ЧАСТНАЯ П/П ПОДЧЕРКИВАНИЯ КУРСОРОМ -
; BC = Y, DE = X
UNDERL:LD A,(UNDRL)
OR A ;РЕЖИМ ПОДЧЕРКИВАНИЯ ?
RET Z ;НЕТ
;
PUSH BC
;
LD A,15
CALL 0F80FH ;C - РЕЖИМ ВЫВОДА КУРСОРА
LD L,C
;
LD A,8
CALL 0F80FH ;C - РЕЖИМ ВЫВОДА СИМВОЛОВ
LD A,C
AND 07H
LD C,A
CALL TVC21 ;УСТАНОВИТЬ НОВЫЙ РЕЖИМ ВЫВОДА КУРСОРА
;
POP BC
;
LD A,2
CALL 0F80FH ;ВЫВЕСТИ КУРСОР
;
LD C,L
JP TVC21 ;ВЕРНУТЬ РЕЖИМ КУРСОРА
;
;
;ОБРАБОТКА УПРАВЛЯЮЩИХ ФУНКЦИЙ
TVC03:LD DE,TVC02
PUSH DE ;АДРЕС ВОЗВРАТА
;
. . .