Файл: jourdain_spravochnik_programmista.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 04.07.2020

Просмотров: 3090

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


Средний уровень.


Функция 9 прерывания 21H выводит строку. DS:DX должны указы-

вать на первый символ строки. Строка должна завершаться символом

$, что означает, что сам символ $ не может входить в строку.

Строка может быть любой длины. Функция не переводит автоматически

курсор на начало следующей строки после завершения вывода; чтобы

это выполнялось надо добавить в конец строки символы 0AH (перевод

строки) и 0DH (возврат каретки).


;---в сегменте данных

FIRST_STRING DB 'This is the first string',0AH,0DH,'$'

SECOND_STRING DB 'And this is the second string$'


;---вывод строки

MOV AH,9 ;номер функции вывода строки

LEA DX,FIRST_STRING ;загружаем адрес первой строки

INT 21H ;печатаем строку с позиции курсора

LEA DX,SECOND_STRING ;загружаем адрес второй строки

INT 21H ;печатаем строку с начала новой строки



Интрепретируются следующие управляющие коды:


ASCII 7 звонок

ASCII 8 возврат на шаг (BackSpace)

ASCII 9 табуляция

ASCII 10 перевод строки

ASCII 13 возврат каретки


Функция DOS 40H прерывания 21H также полезна при выводе строк

на экран. Она требует, чтобы Вы знали длину строки, поскольку ей

не требуется символа-ограничителя; эта функция особенно удобна

для дампа текстовых файлов на экран. Исходно эта функция была

предназначена для вывода в файл. Она требует дескриптора, который

является идентификационным номером для данного файла или уст-

ройства. Дисплей имеет заранее предназначенный дескриптор #1.

Надо поместить дескриптор в BX, а число байтов строки в CX. DS:DX

должны указывать на строку. Функция выводит текст с нормальными

(белый на черном) атрибутами. Отметим, что не надо предварительно

"открывать" дисплей, как это Вы делает с другими файлами при

использовании этой функции. Вот пример:


;---вывод 1000 байтов текста

MOV AH,40H ;номер функции

MOV BX,1 ;дескриптор дисплея

LEA DX,STRING ;загржаем адрес строки

MOV CX,1000 ;число выводимых байтов

INT 21H ;


MS DOS предоставляет набор Esc-последовательностей, которые

являются специальными управляющими строками для аппаратуры. Когда

они выводятся с помощью функции 9 прерывания 21H, то они могут

управлять курсором, режимом дисплея, цветом символов и некоторыми

аспектами клавиатуры. В приложении Д обсуждается как их использо-

вать. Когда программа выводит на экран много строк, то Esc-после-

довательности часто являются самым удобным способом позициониро-

вания курсора и установки цвета строки. Это происходит потому,

что они сами рассматриваются просто как очередные строки в серии

выводимых строк.

У AT и машин, снабженных EGA, функция 13H прерывания 10H выво-

дит строку. ES:BP должны указывать на строку, а длина строки

должна быть в CX. DX указывает позицию курсора, с которой должна

начинаться строка (вычисляемую как смещение от начала страницы,

на которую идет вывод без учета байтов атрибутов). В BX должен

быть указан номер страницы. Наконец номер кода от 0 до 3, содер-


жащийся в AL указывает как должна выводиться строка.


AL = 0 строка состоит только из символов, курсор неподвижен

AL = 1 строка состоит только из символов, курсор движется

AL = 2 в строке чередуются символы и атрибуты,

курсор неподвижен

AL = 3 в строке чередуются символы и атрибуты

курсор движется



Когда AL равно 0 или 1, то атрибуты должны находиться в BL. Все

символы будут выводиться с этими атрибутами. Эта функция интерп-

ретирует возврат на шаг, перевод строки, возврат каретки и звонок

как управляющие команды, а не как печатаемые символы.


Низкий уровень.


Ограничение на использование символа $ делает функцию 9 беспо-

лезной для многих приложений. Однако на многих машинах это е-

динственное прерывание, доступное для вывода строки неизвестной

длины. Попробуйте написать свое собственное прерывание (в [1.2.3]

показано как), использующее технику отображения в память [4.3.1].

Используйте в качестве ограничителя какой-нибудь специальный

символ, например, ASCII 0, вместо $. Сделайте чтобы эта процедура

обрабатывала только те управляющие коды, которые нужны Вам. Такой

метод будет работать намного быстрее, чем при использовании функ-

ции MS DOS.




4.3.3 Чтение символа и его атрибутов в данной позиции.




Обычно программа получает данные из своих переменных и поме-

щает их в видеобуфер для вывода на экран. В некотором смысле

программа "знает" что на экране. Но встречаются ситуации, в кото-

рых сам видеобуфер используется как рабочая область (например, в

графиченских программах вырезки и вставки) и текущее содержимое

экрана не записано в памяти программы. В этих случаях бывает

необходимо прочитать с экрана, виесто того чтобы вывести на него.

Функция BIOS позволяет прочитать символ и его атрибуты в опреде-

ленной позиции экрана; другой метод состоит в обращении метода

прямого отображения в память дисплея [4.3.1]. Чтобы прочитать

символ и атрибуты в строке 0 и столбце 39 (1,40 в Бейсике) в

режиме 80 символов в строке надо сложить (0*160) плюс (39*2) и

взять результат в качестве смешения в видеобуфере. В случае когда

нужны смещения для различных страниц см. [4.5.3]. Имейте ввиду,

что обращение метода прямого отображения в память не будет рабо-

тать в случае вывода символов в графическом режиме.


Высокий уровень.


Бейсик использует функцию SCREEN для получения символа или

атрибутов (эта функция не имеет ничего общего с оператором SCREEN

устанавливающим режим дисплея). SCREEN 5,10 получает код ASCII

символа, расположенного в строке 5, столбце 10 (строки и столбцы

нумеруются от 1). Чтобы получить атрибуты символа надо добавить

третий параметр 1, например, SCREEN 5,10,1. При использовании в

графическом режиме данная функция возвращает 0, если требуемая

позиция экрана не содержит (немодифицированного) символа.

Атрибуты также возвращаются в виде кода от 0 до 255. Поскольку


Бейсик не позволяет использования двоичных чисел, то требуются

некоторые манипуляции, чтобы определить атрибуты. Основной цвет

равен ATTRIBUTE MOD 16. После того как Вы выделили основной цвет,

цвет фона определяется по формуле (((ATTIBUTE - FOREGROUND)/16)

MOD 128). Если байт атрибутов больше 127, то включено мигание

(или, при соответствующей установке, включены интенсивные цвета

фона [4.1.3]). В приложении Б обсуждаются битовые операции в

Бейсике.


Средний уровень.


Функция 8 прерывания 10H возвращает символ и его атрибуты для

текущей позиции курсора. В BH должен содержаться номер текущей

страницы дисплея (отсчитываемый от 0 и всегда равный 0 для монох-

ромного дисплея). Код символа возвращается в AL, а байт атрибутов

в AH. Эта функция настолько мощная, что способна даже читать

символы в графическом режиме, сообщая цвет палетты в AH. Она

работает даже для символов определяемых пользователем [4.3.4]. В

примере определяется символ и атрибуты в позиции 0,39 для страни-

цы 2 графического адаптора:



;---установка позиции курсора

MOV AH,2 ;функция установки курсора

MOV DH,0 ;номер строки

MOV DL,39 ;номер столбца

MOV BH,0 ;номер страницы

INT 10H ;позиционируем курсор

;---чтение символа и атрибутов

MOV AH,8 ;функция чтения символа/атрибутов

MOV BH,2 ;номер страницы

INT 10H ;в AH:AL теперь атрибуты и символ


Низкий уровень.


Надо вычислить смещение и проделать операцию обратную прямой

записи в память. При необходимости надо добавить смещение для

данной страницы. В примере получаем символ и атрибуты в позиции

7,39 страницы 2 графического адаптора:


;---чтение символа и атрибутов позиции 7,39 страницы 2

MOV AX,0B800H ;адрес видеобуфера

MOV ES,AX ;ES указывает на первый байт буфера

MOV DI,1000H ;смещение до начала страницы

MOV AL,80 ;умножаем номер строки на 160

MOV BL,7 ;номер строки

MUL BL ;теперь в AX (строка-1)*160

MOV AX,39 ;номер столбца

ADD BX,AX ;номер позиции в видеобуфере

SHL BX,1 ;умножаем его на два

MOV AX,ES:[BX][DI] ;теперь AH:AL содержат атрибуты/символ




4.3.4 Создание специальных символов.




Только монохромный адаптор не может выводить символы вида,

заданного самим программистом. Цветной адаптор позволяет 128

символов, определяемых пользователем, PCjr - 256, а EGA - 1024 из

которых одновременно доступно 512. Для цветного адаптора ROM-BIOS

содержит данные для разрисовки только первых 128 символов набора

ASCII (с номерами от 0 до 127). Следующие 128 символов недоступны

для Вас, пока Вы не создатите их, используя описанную здесь тех-

нику. Отметим, что MS DOS 3.00 предоставляет команду GRAFTABL,

которая предоставляет требуемые данные для второй порции из 128

символов. PCjr имеет данные для второй порции из 128 символов уже

готовые. EGA имеет полные наборы символов для режимов с 200 стро-

ками и с 350 строками.

Символы для графического адаптора и PCjr описываются с помощью


матрицы 8*8 точек. Данные для каждого символа содержатся в восьми

байтах. Каждый байт содержит установку для точек одного ряда,

начиная с верхнего ряда, причем старший бит (номер 7) соответст-

вует самой левой точке в ряду. Когда соответствующий бит равен 1,

то точка высвечивается. Для описания символа Вы должны определить

правильные последовательности битов для восьми байтов и поместить

их в последовательные ячейки памяти. На рис. 4-3 показано как 8

байтов описывают бубновую масть.

Все 128 символов вместе требуют 1024 байта, хотя вовсе не

требуется, чтобы были описаны все символы. Специальный вектор

прерывания (постоянный указатель в младших адресах памяти

[1.2.0]) указывает на адрес первого байта первого символа расши-

ренного набора, т.е. на символ номер 128. Когда в позицию символа

в видеобуфере посылается код 128, то просматриваются и выводятся

первые восемь байт. Если номер символа 129, то выводятся байты с

девятого по шестнадцатый, и т.д.

Номер этого вектора прерывания 1FH и он расположен по адресу

0000:007C. Поместите значение смещения в младшее слово (сначала

младший байт), а адрес сегмента - в старшее слово (снова, сначала

младший байт). Отметим, что можно символы с большими номерами

кодов, не отводя памяти для символов с меньшими номерами; надо

просто чтобы вектор указывал на некоторый адрес, который меньше,

чем адрес начала блока, содержащего данные для описания символов.

Восьмибайтные последовательности, описывающие символы ASCII с

кодами 128-255 приведены в [4.3.5]. У PCjr вектор 1FH указывает

на вторые 128 символов ASCII, а вектор 44H - на первые. Оба этих

вектора могут быть изменены, допуская полный набор 256 символов,

определяемых пользователем.

Для EGA картина намного сложнее, но и намного гибче. При ини-

циализации текстового режима один из двух наборов символов (8*8

или 8*14) копируется из ПЗУ EGA в карту битов 2 видеобуфера. Эта

часть буфера рассматривается как разбитая на блоки, причем стан-

дартный набор символов помещается в блок 0. При условии, что EGA

оснащен достаточной памятью могут быть определены еще три блока

для описания символов. Размер блока определяется числом строк

матрицы, используемой для описания символа. Символы, описываемые

матрицей 8*8 требуют 8*256 или 2048 байт. Когда разрешены более

одного блока символов, то бит 3 байта атрибутов определяет из

какого блока будут браться данные для описания символа.



Какой из блоков будет использоваться зависит от установки

битов 0-3 регистра выбора карты символов, адрес порта которого

3C5H. Предварительно надо послать 3 в порт 3C4H, чтобы указать

требуемый регистр. Биты 1-0 дают номер блока символов, который

берется когда бит 3 байта атрибутов равен 0, а биты 3-2 - делают

то же самое, когда бит 3 равен 1. Когда установка обоих пар битов

совпадает, то возможность использования двух наборов символов


отсутствует и бит 3 байта атрибутов переключается на установку

интенсивности символа. В этом случае используется только блок 0.

Однако никто не может помешать Вам поместить свои символы в любую

нужную Вам позицию в этом блоке. Если Вы изменили стандартный

набор символов, то Вы можете в любой момент восстановить его из

ПЗУ.


Высокий уровень.


В Бейсике Вы должны позаботиться о том, чтобы данные описываю-

щие символы находились за пределами памяти, используемой програм-

мой. Если имеется много памяти, то можно поместить данные в стар-

шие адреса; если имеется опасность конфликта, то следует исполь-

зовать команду CLEAR для ограничения количества памяти, которую

может использовать Бейсик. Затем следует поместить адрес первого

байта данных в вектор прерывания. В следующем примере описывается

символ 128 как квадратная рамка. Операторы DATA содержат значе-

ния, описывающие символ. Они равны либо 255, либо 129; в первом

случае все биты равны 1, а во втором равны 1 только крайние биты.

О вычислении десятичных значений, соответствующих данным цепочкам

битов см. приложение Б.


100 '''помещаем данные, начиная с адреса &H3000

110 DATA 255, 129, 129, 129, 129, 129, 129, 255

120 DEF SEG = &H3000 'указываем начало сегмента

130 FOR N = 0 TO 7 'определяем 8 байт

140 READ Q 'читаем 1 байт

150 POKE N,Q 'помещаем его в память

160 NEXT 'и т.д.

170 '''установка вектора прерывания

180 DEF SEG = 0 'указываем на начало памяти

190 POKE 124,0 'указываем смещение

200 POKE 125,0 '

210 POKE 126,0 'указываем сегмент

220 POKE 127,&H30 '

230 '''печатаем символ

240 LOCATE 12,12: PRINT CHR$(128) 'теперь есть символ 128


Средний уровень.


Для цветного адаптора и PCjr используйте функцию 25H прерыва-

ния 21H для изменения вектора прерывания 1FH. При входе DS:DX

должны указывать на первый байт блока данных. Более подробное

описание см. в [1.2.3]. В примере создаются два символа с номера-

ми 128 и 129. Они являются зеркальными отображениями друг друга,

а выведенные подряд образуют небольшой прямоугольник.



;---в сегменте данных

CHARACTER_DATA DB 11111111B, 10000000B, 10000000B, 10000000B

DB 10000000B, 10000000B, 10000000B, 11111111B

DB 11111111B, 00000001B, 00000001B, 00000001B

DB 00000001B, 00000001B, 00000001B, 11111111B


;---установка вектора прерывания

PUSH DS ;сохраняем DS

LEA DX,CHAR_DATA ;смещение для данных в DX

MOV AX,SEG CHAR_DATA ;сегмент для данных в DS

MOV DS,AX ;

MOV AH,25H ;функция установки вектора

MOV AL,1FH ;номер изменяемого вектора

INT 21H ;установка вектора

POP DS ;восстанавливаем DS


;---печать символов

MOV AH,2 ;номер функции

MOV DL,128 ;первый символ

INT 21H ;вывод его

MOV DL,129 ;второй символ

INT 21H ;вывод его


Для EGA функция 11H прерывания 10H манипулирует набором симво-

лов. Эта функция может быть очень сложной, когда она используется

для создания специальных режимов экрана, но ее основное примене-

ние достаточно простое. Имеется четыре подфункции. Когда AL равен