Справочник программиста на персональном компьютере фирмы IBM. Вывод на терминал - Изменение формы курсора
ОГЛАВЛЕНИЕ
4.2.4 Изменение формы курсора.
Курсор может меняться по толщине от тонкой линии до максималь-
ного размера, отводимого под символ. Он строится из коротких
горизонтальных отрезков, верхний из которых называется "начальной
строкой" курсора, а нижний - "конечной строкой". Для монохромного
дисплея под каждый символ отводится 14 строк, пронумерованных от
0 до 13, начиная сверху. Промежутки между символами обеспечивают-
ся двумя верхними строками и тремя нижними. Большинство символов
распологаются в строках 2-10, хотя хвостики некоторых символов
достигают линий 12 и 13, в то время как подчеркивание занимает
одну двенадцатую строку.
На 200-строчном цветном дисплее для каждого символа отводится
только 8 строк, а символ рисуется в верхних семи строках. Эти 8
строк пронумерованы от 0 до 7, начиная сверху, и нормальный кур-
сор формируется одной строкой 7. (Отметим, что на цветном дисплее
нет подчеркивания, поскольку использование для подчеркивания
строки 7 привело бы к тому, что символы сливались бы с располо-
женными под ними.) Цветной дисплей высокого разрешения использует
14-строчный монохромный вариант, когда он работает в режиме высо-
кого разрешения, а когда он работает в одном из цветных графичес-
ких режимов, то он использует 8-строчный режим.
Курсор может быть сформирован любой комбинацией прилегающих
отрезков. Для монохромного дисплея он занимает все отведенное под
символ место, когда "начальная строка" равна 0, а "конечная стро-
ка" равна 13 (для графического дисплея надо использовать значение
"конечной строки" равное 7). Если значения "начальной" и "конеч-
ной" строки совпадают, то возникает однострочный курсор. Если
номер "конечной строки" меньше чем "начальной" то возникает кур-
сор, состоящий из двух частей, так как происходит перенос в верх-
ние строки. Например, если "начальная строка" равна 12, а "конеч-
ная" - 1, то сначала заполняется строка 12, затем 13, затем 0 и,
наконец, 1. Курсор при этом принимает форму двух параллельных
линий, указывающих верхнюю и нижнюю границы ряда, который он
занимает.
BIOS хранит 2-байтную переменную по адресу 0040:0060, которая
содержит текущие значения "начальной" и "конечной" строк. Первый
байт содержит значение "конечной строки", а второй - "начальной".
Высокий уровень.
В Бейсике оператор LOCATE может не только позиционировать
курсор и включать или выключать его, но и управлять его формой.
Парметры, устанавливающие "начальную" и "конечную" строки - это
4-е и 5-е число, следующие за словом LOCATE. Другие параметры
могут быть опущены, если присутствуют разделяющие их запятые.
Таким образом, чтобы создать толстый курсор, занимающий строки со
2 по 12, надо записать LOCATE ,,,2,12. Отметим, что Бейсик обычно
выключает курсор, когда начинает выполнение программы. Как вклю-
чить его обратно см. в [4.2.3].
Средний уровень.
Функция 1 прерывания BIOS 10H устанавливает "начальную" и
"конечную" строки курсора. В CH должна быть указана "начальная",
а в CL - "конечная" строка.
;---установка "начальной" и "конечной" строк курсора
MOV AH,1 ;номер функции
MOV CH,0 ;начать курсор в верхней строке
MOV CL,7 ;окончить курсор в восьмой строке
INT 10H ;
Низкий уровень.
Регистры 10 и 11 контроллера дисплея 6845 содержат значения
"начальной" и "конечной" строки, соответственно. Доступ к обоим
регистрам осуществляется через порт 3B5H для монохромного адапто-
ра и 3D5H - для цветного алаптора и PCjr. Предварительно надо
послать номер требуемого регистра в адресный регистр, имеющий
адрес порта 3B4H (см. [4.1.1]). Значения занимают младший конец
каждого регистра. Однако регистр "начальной" строки (#10) битами
5 и 6 индицирует также должен ли выводиться курсор. Поскольку
курсор выводится, когда оба этих бита сброшены в 0, то просто
поместив в регистр номер "начальной" строки мы установим эти биты
в 0. Остальные биты этого регистра не используются.
;---установка "начальной" строки
MOV DX,3B4H ;доступ к адресному регистру 6845
MOV AL,10 ;выбор регистра 6845
OUT DX,AL ;посылка запроса
MOV AL,0 ;номер "начальной строки" 0
INC DX ;переходим к управляющему регистру
OUT DX,AL ;посылаем номер "начальной строки"
;---установка "конечной строки"
MOV AL,11 ;выбираем регистр 11
DEC DX ;возвращаемся к адресному регистру
OUT DX,AL ;посылаем запрос
MOV AL,7 ;номер "конечной строки" 7
INC DX ;переходим к управляющему регистру
OUT DX,AL ;посылаем номер "конечной строки"