10H; которая выводит символ и атрибуты столько раз, сколько ука-
зано в CX. Значение 2000 чистит весь экран, если курсор был уста-
новлен в 0,0, используя метод показанный в [4.2.1]. AH должен
содержать символ пробела, AL - байт атрибутов, а BH - номер стра-
ницы дисплея.
;---установка курсора в левый верхний угол экрана
MOV AH,2 ;функция установки курсора
MOV BH,0 ;номер страницы
MOV DX,0 ;координаты 0,0
INT 10H ;устанавливаем курсор
;---вывод символа пробела 2000 раз
MOV AH,9 ;номер функции
MOV CX,2000 ;число повторений вывода
MOV AL,' ' ;символ пробела в AL
MOV BL,7 ;атрибуты в BL
INT 10H ;очистка экрана
Hаконец, DOS обеспечивает очистку экрана с помощью специальных
Esc-последовательностей, которые работают с драйвером ANSI.SYS.
Основные сведения о нем приведены в приложении Д. Эти последова-
тельности - это строки, начинающиеся с символа Esc, а завершаю-
щиеся ограничителем $. Такие строки выводятся функцией 9 прерыва-
ния 21H, при этом DS:DX должны указывать на первый символ строки.
DOS интерпретирует строку не выводя ее на дисплей. Чтобы стереть
весь экран строка должна быть [2J. Чтобы стереть конец строки,
начиная от позиции курсора (включая эту позицию), строка [K.
;---в сегменте данных
CLEAR_LINE DB 27,'[K$'
;---очистка конца строки, начиная от позиции курсора
MOV AH,9 ;функция вывода строки
LEA DX,CLEAR_LINE ;DX должен указывать на начало строки
INT 21H ;стираем конец строки
Hизкий уровень.
Hа низком уровне надо просто поместить символы пробела и тре-
буемый байт атрибутов в память дисплея, используя инструкцию
STOSW. Вот пример для монохромного дисплея:
MOV AX,0B000H ;указываем на память дисплея
MOV ES,AX ;
MOV DI,0 ;DI указывает на начало буфера
MOV AL,32 ;символ пробела
MOV AH,7 ;нормальные атрибуты
MOV CX,2000 ;число повторений
REP STOSW ;посылаем AX в ES:DI 2000 раз
4.1.6 Переключение между видеоадапторами.
Машина может быть оснащена и монохромным и цветным адаптором,
или одним из этих адапторов и EGA. Программа может выбирать,
какой из мониторов должен быть активным, изменяя значения битов 4
и 5 в ячейке памяти 0000:0410. Установив оба этих бита в 1 мы
выбираем монохромный адаптор. Изменив установку битов 5-4 на 10
устанавливаем графический адаптор в режиме 80 символов в строке,
а на 01 - 40 символов в строке. И, наконец, изменив биты на 00,
выбираем EGA. Во всех случаях Вы должны немедленно подать команду
установки режима, поскольку BIOS имеет еще очень много регистров,
которые надо изменить, прежде чем дисплей будет работать нормаль-
но.
Отметим, что хотя операционная система не может управлять
одновременно двумя мониторами, программы могут осуществлять вывод
на оба дисплея, используя прямое отображение в память [4.3.1] для
адресов буфера неактивного монитора.
Высокий уровень.
В Бейсике надо просто использовать следующий код:
100 'Переключение на монохромный дисплей
110 KEY OFF: CLS
120 WIDTH 40
130 DEF SEG = 0
140 M = PEEK(&H410)
150 POKE &H410,M OR &H30
160 WIDTH 80
170 LOCATE,,1,12,13
180 KEY ON
100 'Переключение на цветной графический дисплей (80 символов)
110 KEY OFF: CLS
120 WIDTH 80
130 DEF SEG = 0
140 M = PEEK(&H410)
150 POKE &H410,(M AND &HCF) OR &H20
160 WIDTH 80
170 SCREEN 0
180 LOCATE,,1,6,7
190 KEY ON
100 'Переключение на EGA (80 символов)
110 KEY OFF: CLS
120 WIDTH 80
130 DEF SEG = 0
140 M = PEEK(&H410)
150 POKE &H410,M AND &HCF
160 WIDTH 80
170 SCREEN 0
180 LOCATE,,1,6,7
190 KEY ON
Измените команды WIDTH и SCREEN, чтобы переключиться на другие
начальные режимы дисплея.
Hизкий уровень.
В ассемблере, как и в Бейсике, надо прямо изменить биты 4 и 5
по адресу 0000:0410. Hадо сбросить режим дисплея сразу вслед за
изменением.
;---переключение на монохромный монитор
SUB AX,AX ;обнуляем AX
MOV ES,AX ;устанавливаем ES на начало памяти
MOV DL,ES:[410H] ;получаем байт по адресу 0000:0410
OR DL,00110000B ;устанавливаем биты 4 и 5
MOV ES:[410H],DL ;возвращаем байт
MOV AH,0 ;фукция установки режима дисплея
MOV AL,0 ;монохромный режим 80*25
INT 10H ;устанавливаем режим
;---переключение на цветной монитор (40 символов)
SUB AX,AX ;устанавливаем ES на начало памяти
MOV ES,AX ;
MOV DL,ES:[410H] ;берем байт по адресу 0000:0410
AND DL,11001111B ;сбрасываем биты 4 и 5
OR DL,00010000B ;устанавливаем бит 4
MOV ES:[410H],DL ;возвращаем байт
MOV AH,0 ;функция установки режима дисплея
MOV AL,1 ;цветной режим 40*25
INT 10H ;устанавливаем режим
;---переключение на EGA
SUB AX,AX ;устанавливаем ES на начало памяти
MOV ES,AX ;
MOV DL,ES:[410H] ;берем байт по адресу 0000:0410
AND DL,11001111B ;сбрасываем биты 4 и 5
MOV ES:[410H],DL ;возвращаем байт
MOV AH,0 ;функция установки режима дисплея
MOV AL,1 ;цветной режим 40*25
INT 10H ;устанавливаем режим
Раздел 2. Управление курсором.
Kурсор служит двум целям. Во-первых, он служит указателем
места на экране, в которое операторы программы посылают свой
вывод. Во-вторых, он обеспечивает видимую точку отсчета на экране
для пользователя программы. Только для второго применения курсор
должен быть видимым. Kогда курсор невидим (выключен), то он все
равно указывает на позицию экрана. Это важно, поскольку любой
вывод на экран, поддерживаемый операционной системой, начинается
с текущей позиции курсора.
Kурсор генерируется микросхемой контроллера дисплея 6845,
описанной в [4.1.1]. Эта микросхема имеет регистры, устанавливаю-
щие размер и положение курсора. Микросхема 6845 делает только
мерцающий курсор, хотя имеются программные способы создания не-
мерцающего курсора [4.2.6]. Частота мерцания курсора не может
быть изменена. В графических режимах курсор не выводится, хотя
символы позиционируются на экране теми же самыми процедурами
установки курсора, что и в текстовых режимах.
Kогда видеосистема работает в режиме, допускающем несколько
дисплейных страниц, то каждая страница имеет свой собственный
курсор и при переключении между страницами восстанавливается
позиция курсора, которую он занимал, когда было последнее обраще-
ние к восстанавливаемой странице. Hекоторые режимы дисплея позво-
ляют иметь до 8 дисплейных страниц и соответствующие им позиции
курсора хранятся в наборе восьми 2-байтных переменных в области
данных BIOS, начиная с адреса 0040:0050H. В каждой переменной
младший байт содержит номер столбца, отсчитывая от 0, а старший
байт содержит номер строки, также отсчитывая от 0. Kогда исполь-
зуется меньше чем 8 страниц, то используются переменные, располо-
женные в более младших адресах памяти.
4.2.1 Установка курсора в абсолютную позицию.
Для курсора могут быть установлены абсолютные координаты или
координаты относительно его текущей позиции [4.2.2]. Абсолютные
координаты могут меняться в пределах 25 строк и 80 (иногда 40)
столбцов. Языки высокого уровня обычно отсчитывают координаты
экрана, начиная с 1, и таким образом позиция левого верхнего угла
1,1. Язык ассемблера всегда начинает отсчет с нуля и позиция
левого верхнего угла 0,0.
Высокий уровень.
Бейсик нумерует строки от 1 до 25, а столбцы от 1 до 80. Фор-
мат оператора LOCATE, который устанавливает позицию курсора та-
кой: LOCATE строка,столбец. Если установки курсора не делается,
то он переходит в первую позицию строки после ввода возврата
каретки, а сдвиг экрана начинается после того, как будет заполне-
на 24-я строка. Чтобы вывести в 25-ю строку Вы должны использо-
вать LOCATE (предварительно очистив эту строку с помощью KEY
OFF). Для отмены автоматического сдвига экрана в строках 24 и 25
надо завершать оператор PRINT точкой с запятой (чтобы отменить
сдвиг в позициях 24,80 и 25,80 надо использовать прямое отображе-
ние в память [4.3.1]). Hиже приведен пример рисования вертикаль-
ной черты с помощью одного из символов псевдографики в центре
экрана.
100 FOR N = 1 TO 25 'повтор для каждой строки
110 LOCATE N,40 'установка курсора в середину строки
120 PRINT CHR$(186); 'печатаем вертикальную черту
130 NEXT 'переход к следующей строке
Kогда используется несколько дисплейных страниц, то оператор
LOCATE действует на текущей активной странице памяти. Если стра-
ница, выводимая в данный момент на монитор, не активна, то поло-
жение курсора на экране не меняется. Отметим, что Бейсик имеет
собственную переменную, хранящую текущее положение курсора. Если
Вы подключите ассемблерную подпрограмму, которая изменит положе-
ние курсора, то Бейсик проигнорирует новую позицию курсора, когда
ему будет возвращено управление.
Средний уровень.
Операционная система предоставляет два способа позиционирова-
ния курсора в абсолютную позицию на экране. Функция 2 прерывания
10H устанавливает курсор, относящийся к указанной странице памя-
ти. Страницы нумеруются начиная с нуля и для монохромного дисплея
номер страницы (находящийся в BH) должен всегда быть равным 0.
DH:DL содержат строку и столбец, которые тоже нумеруются с 0.
Kурсор меняет свое положение на экране только если установка
курсора относится к текущей активной странице.
;---установка курсора в строку 13, столбец 39
MOV AH,2 ;номер функции
MOV BH,0 ;номер страницы
MOV DH,13 ;строка
MOV DL,39 ;столбец
INT 10H ;позиционируем курсор
Второй метод позиционирования курсора состоит в использовании
специального драйвера устройства ANSI.SYS, который должен быть
загружен при старте системы. В приложении Д даны необходимые
сведения. Для вывода строки, содержащей информацию о строке и
столбце используется функция 9 прерывания 21H. Строка начинается
с символа Esc (ASCII 27), а завершается символом ограничителем $.
Формат строки Esc[строка,столбецH$, где строка и столбец нуме-
руются от нуля, а Esc обозначает код ASCII 27. Hапример, строка
27,'10;60H$' устанавливает курсор в строку 10, столбец 60.
Хотя такой метод кажется излишне сложным, но он оказывается
очень удобным при выводе ряда строк на экран, так как Esc-после-
довательность обрабатывается как одна из строк набора. В данном
примере три строки сообщения разбросаны по всему экрану.
;---в сегменте данных
POSITION_1 DB 27,'[10;30H$'
STRING_1 DB 'There are two options:$'
POSITION_2 DB 27,'[13;32H$'
STRING_2 DB '(1) Review part 1$'
POSITION_3 DB 27,'[15;32H$'
STRING_3 DB '(2) Move on to part 2$'
;---печать строк
MOV AH,9 ;номер функции вывода строки
LEA DX,POSITION_1 ;1-я строка позиционирования курсора
INT 21H ;позиционируем курсор
LEA DX,STRING_1 ;1-я текстовая строка
INT 21H ;вывод строки
LEA DX,POSITION_2 ;и т.д.
INT 21H ;
LEA DX,STRING_2 ;
INT 21H ;
LEA DX,POSITION_3 ;
INT 21H ;
LEA DX,STRING_3 ;
INT 21H ;
Hизкий уровень.
Регистры 14 и 15 микросхемы 6845 хранят положение курсора. Вы
можете изменить их значение и курсор передвинется в соответствую-
щую позицию экрана, но прерывания вывода на экран DOS и BIOS
будут игнорировать Вашу установку и вернут курсор в старое поло-
жение. Это происходит потому, что каждый раз при вызове этих
прерываний, они восстанавливают регистры курсора, используя