Периферийные устройства являются важнейшей и

advertisement
Периферийные устройства являются важнейшей и неотъемлемой составной частью всех
вычислительных систем. Для ПЭВМ типа IBM PC характерно применение аппарата
базовой системы ввода-вывода (BIOS), процедуры которой записаны в постоянном
запоминающем устройстве ЭВМ (ROM BIOS). Процедуры BIOS представляют собой
сервисные программы управления конкретной функцией периферийного устройства.
Пользователь может использовать процедуры BIOS, вызывая их из своей программы с
помощью механизма, называемого программными прерываниями. В отличие от
аппаратных прерываний, программные прерывания происходят только при выполнении
специальной команды программного прерывания - int.
Формат этой команды:
int номер-прерывания
где номер-прерывания - это некоторое число,которое определяет выполняемую этой
командой сервисную функцию. Например, прерывание с кодом 13h обеспечивает работу
с дисковыми накопителями, а с кодом 17h - обеспечивает поддержку принтера. По
номеру прерывания из таблицы адресов процедур обработки прерываний (таблицы
векторов прерываний) выбирается адрес необходимой для выполнения этой сервисной
функции процедуры. Команда int исполняется следующим образом: в стеке сохраняются
регистр флагов, CS, IP и затем производится переход на подпрограмму обработки
прерывания, адрес которой выбирается из таблицы векторов в соответствии с номером
прерывания. Перед выполнением команды int в регистры процессора должны быть
занесены необходимые исходные данные. Результаты выполнения процедура обработки
прерывания возвращает также в регистрах процессора. Таблица векторов прерываний
занимает 1024 байта начиная с адреса 0000h:0000h, а с адреса 0000h:0400h расположена
область данных ROM BIOS. Размер этой области - 256 байт.
В ячейках области данных BIOS содержится информация о текущих значениях
переменных BIOS, таких как номер текущего видеорежима, координаты курсора и т.д.
Программа пользователя может читать информацию из эитх ячеек и модифицировать
их, если это необходимо. Полное описание области данных ROM BIOS приведено в [1], а
ниже описано назначение ячеек ROM BIOS, которые используются в примерах
программы к соответствующим темам:
408h - слово,содержащее адрес первого параллельного порта,
417h - байт,содержащий состояние клавиш Shift,...,
449h - байт,содержащий текущий видеорежим,
462h - байт,содержащий номер текущей видеостраницы,
46Сh - длинное целое с счетчиком времени в тиках,
470h - байт,содержащий флаг переполнения счетчика времени.
Следовательно, как адрес параллельного порта (LPT1) необходимо использовать слово
по адресу 408h. Для измерения временных интервалов при работе с накопителем на
гибких магнитных диска в теме 4 используется счетчик времени, находящийся по адресу
46C. Байт по адресу 462h определяет номер текущей видеостраницы, что используется во
многих работах.
1. ОРГАНИЗАЦИЯ ВВОДА/ВЫВОДА ПРИ ПОМОЩИ СРЕДСТВ BIOS
В теме №1 изучаются возможности, предоставляемые программисту процедурами управления терминалом и клавиатурой. Эти
процедуры находятся в ROM BIOS и могут быть вызваны пользователем через прерывания 10h и 16h. Функции прерывания 10h поз-
воляют программисту полностью использовать возможности имеющейся у конкретной ПЭВМ видеоаппаратуры, а прерывание 10h
позволяет организовать интерфейс с пользователями. Полное
описание функций прерываний 10h и 16h приводится в прил.1.
Ниже приводится краткое описание форматов вызова функций, необходимых для написания лабораторных работ.
ПРЕРЫВАНИЕ 10H
ФУНКЦИЯ 0
ВИДЕОСЕРВИС
УСТАНОВКА ВИДЕОРЕЖИМА
Эта функция позволяет установить текущий видеорежим для
терминала, т.е. задать режим работы, цвета и т.д.
Обращение: AH = 00h
AL = Номер устанавливаемого видеорежима
ФУНКЦИЯ 2
УСТАНОВКА ПОЛОЖЕНИЯ КУРСОРА
Предназначена для изменения текущего положения курсора
на экране. Положение курсора хранится отдельно для каждой видеостраницы. При выводе на экран используется положение курсора для текущей видеостраницы. Положение курсора определяется номером столбца и строки (0-79) и вертикали (0-42).
Обращение: AH = 02h
DH = Y (Номер строки)
DL = X (Номер столбца)
BH = Номер видеостраницы, для которой
изменяется положение курсора
ФУНКЦИЯ 3
ОПРЕДЕЛЕНИЕ ТЕКУЩЕГО ПОЛОЖЕНИЯ КУРСОРА
Предназначена для определения текущих координат и размера курсора.
Обращение: AH = 03h
BH = Номер видеостраницы, для которой
определяется положение курсора
Возвращает: DH = Y (Номер строки
позиции курсора)
DL = X (Номер столбца позиции
курсора)
CH = Начальная линия блока курсора
CL = Последняя линия блока курсора
ФУНКЦИЯ 5
ВЫБРАТЬ ОТОБРАЖАЕМУЮ ВИДЕОСТРАНИЦУ
Предназначена для переключения текущей видеостраницы.
Отображаться на экране видеомонитора может только одна видеостраница, а их может быть от 1 до 8 в зависимости от видеорежима. В неактивную видеостраницу (то есть в ту,которая не
находится на экране) вывод возможен, но на экране этот вывод
будет отображен только при переключении этой страницы в режим активной .
Обращение :
AH = 05h
AL = номер видеостраницы, которую
активной (отображаемой).
ФУНКЦИИ 6,7
СКРОЛЛИНГ СТРАНИЦЫ ВВЕРХ ИЛИ ВНИЗ.
Предназначены для сдвига информации в окне на текущей
видеостранице на одну строку вверх (вставка пустой строки
снизу) или вниз (вставка пустой строки сверху) .
Обращение : AH = 06h - вверх
= 07h - вниз
AL = на сколько строк сдвинуть информацию
0 - очистка всего окна
BH = байт атрибутов для пустой строки
CH,CL = (Y,X) верхнего левого угла окна
DH,DL = (Y,X) нижнего правого угла окна
ФУНКЦИЯ 9
ВЫВОД СИМВОЛА С АТРИБУТАМИ В
ТЕКУЩЕЙ ПОЗИЦИИ КУРСОРА.
Предназначена для вывода одного или последовательности
одинаковых символов начиная с текущей позиции курсора.
Обращение : AH = 09h
AL = символ, который надо вывести
BH = номер видеостраницы на которую вывести
BL = атрибуты символа
(алфавитно-цифровой режим) или цвет
(графический режим)
CX = количество повторений вывода
одного символа
Примечания :
1. Отображаются все символы в том числе и BS,CR,LF,
Bell не учитывая их специального назначение.
2. Если в цвете в графическом режиме бит 7=1, то символы выводятся на экран по XOR.
3. Эта функция не меняет текущего положения курсора,
то есть пользователь должен его передвигать сам.
ФУНКЦИЯ 0FH
ПОЛУЧИТЬ НОМЕР ТЕКУЩЕГО ВИДЕОРЕЖИМА
Предназначена для получения номера текущего видеорежима и номера текущей видеостраницы.
Обращение : AH = 0Fh
Возвращает : AH = количество столбцов (по X) на
экране (40,80,132)
BH = номер текущей видеостраницы (462h)
AL = номер текущего видеорежима (449h)
ПРЕРЫВАНИЕ 16H
УПРАВЛЕНИЕ КЛАВИАТУРОЙ
Это прерывание позволяет программисту использовать три
основных примитива работы с клавиатурой , обеспечиваемых
BIOS :
ФУНКЦИЯ 0
ПОЛУЧИТЬ СИМВОЛ ИЗ БУФЕРА КЛАВИАТУРЫ,
ЕСЛИ БУФЕР ПУСТ ТО ОЖИДАТЬ СИМВОЛ.
Предназначена для использования в режимах ввода c ожиданием . Функциональные клавиши возвращают в качестве символа 0 , а вместо скан-кода - код функциональной клавиши.
Обращение : AH = 00h
Возвращает: AH = скан-код (или код функциональной
клавиши)
AL = код символа (или 0 в случае
функциональной клавиши)
ФУНКЦИЯ 1
ПРОВЕРИТЬ НА НАЛИЧИЕ СИМВОЛА В БУФЕРЕ.
Предназначена для использования режимах ввода без ожидания . Функциональные клавиши также возвращают в AL 0 , а в
AH свой код . Но в отличие от функции 0 эта функция не заби-
рает символ из буфера клавиатуры , а просто копирует содержимое вершины буфера клавиатуры в регистр AX . Поэтому если
функция возвратила флаг ZF=0 , необходимо получить (удалить)
символ вызовом функции 0.
Обращение : AH = 01h
Возвращает: AH = скан код (или код функциональной
клавиши)
AL = символ ( или 0 )
в случае если ZF = 0
если ZF = 1 , то символа в буфере
нет
ФУНКЦИЯ 2
ПОЛУЧИТЬ СОСТОЯНИЕ КЛАВИАТУРЫ.
Эта функция позволяет программисту получить текущее
состояние флагов клавиатуры таких как Shift , Ctrl , Alt ,
Scroll Lock , Num Lock , Insert .
Обращение : AH = 02h
Возвращает: AL = Байт состояния клавиатуры
Биты ( = 1 )
0 = правый Shift отпущен
1 = левый SHift отпущен
2 = Ctrl отпущен
3 = Alt отпущен
4 = Scroll lock нажат
5 = Num lock нажат
6 = Caps lock нажат
7 = Insert нажат
Примечания :
1. Эту же информацию можно получить анализируя по тем
же правилам байт по адресу 0:417h
2. Для XT при записи байта по адресу 0:417h изменяется
состояние Caps , Num , Scroll , но индикаторы клавиатуры не
отслеживают это изменение .
3. Клавиша Insert не только устанавливает или сбрасывает бит 7 в слове состояния, но и генерирует расширенный
код 82(10).
Пример оформления программы
const
message:string = 'hello,world ...';
begin
asm
mov ax,600h { Установка окна }
mov bh,44h
{ цвет и фон
}
mov cx,0505h { (5,5)
}
mov dx,1525h { (21,37)
}
int 10h
{
}
sub ax,ax
{ Получить номер }
mov es,ax
{ текущей видеостр. }
mov bh,es:[462h] { из ячейки 0:462h }
mov bl,03h
{
}
mov ah,02h
{ Установка
}
mov dx,1010h { курсора
}
int 10h
{ в точку (16,16) }
lea si,message { ds:si укзывает на }
lodsb
{ начало строки
}
sub ah,ah
{
}
mov cx,ax
{ в CX длина строки }
@next: mov ah,09h
{
}
lodsb
{ в AX текущий элемент}
push cx
{
}
mov cx,1
{
}
int 10h
{ Вывод этого символа }
mov ah,02h
{
}
inc dx
{ Перемещение курсора }
int 10h
{
}
pop cx
{
}
loop @next
{ Цикл по всей строке }
sub
ax,ax
{ ожидание нажатия }
int
16h
{ любой клавиши
}
end;
end.
5. КООРДИНАТНОЕ УСТРОЙСТВО ВВОДА ИНФОРМАЦИИ "МЫШЬ"
Мышь - это координатное устройства ввода информации в
ПЭВМ. При каждом перемещении мыши она передает в ПЭВМ три
байта - относительное перемещение по осям X и Y и состояние
каждой клавиши (нажата или отпущена). Мышь подключается к
последовательному порту ПЭВМ и прерывания от нее обслуживаются специальной программой - драйвером мыши. Для программиста мышь характеризуется параметрами :
- Видимость и форма курсора
- Текущие координаты мыши
- Состояние клавиш мыши
Мышиный курсор может находится в двух состояниях (видимый и невидимый) и может быть двух типов : графический и
текстовый. Драйвер мыши поддерживает два вида текстового курсора : жесткий курсор (аналогично обычному курсору текстового режима) и мягкий курсор (задается по матрице символа).
Координаты драйвер мыши возвращает всегда в пикселах,
т.е. в диапазоне от 320*200 от 640*350 в зависимости от текущего видеорежиме. Программист может получить от драйвера
как абсолютные координаты так и значения относительных перемещений мыши по осям X и Y. После чтения счетчиков относительных перемещений они обнуляются.
Драйвер мыши фиксирует раздельно количество нажатий и
количество отпусканий каждой клавиши. В байте состояния
клавиш под каждую клавишу отведен один бит и равенство его
единице означает в зависимости от кода запроса (5 или 6) нажатое или отжатое состояние клавиши.
Для обращения к сервисным функция драйвера мыши используется прерывание 33h. Ниже рассмотрены некоторые основные функции драйвера мыши.
ФУНКЦИЯ 0
СБРОС ДРАЙВЕРА МЫШИ
Необходимо для определения наличия драйвера и мыши,
определения характеристик мыши.
Обращение : AX = 0
Возвращает: AX = 0
нет драйвера и/или мыши
AX = FFFFH есть драйвер и мышь
В этом случае
ВХ = -1 - двухкнопочная мышь
ВХ = 0 - несколько кнопок
ФУНКЦИЯ 1
ВИЗУАЛИЗИРУЕТ КУРСОР МЫШИ
Предназначена для определения позиции мыши на экране
Обращение : AX = 1
ФУНКЦИЯ 2
ГАШЕНИЕ КУРСОРА МЫШИ
Предназначена для скрытия курсора мыши
Обращение : AX = 2
ФУНКЦИЯ 5,6
ПРОЧИТАТЬ ИНФОРМАЦИЮ О ПОЛОЖЕНИИ
КУРСОРА МЫШИ И СОСТОЯНИИ КЛАВИШ
Предназначена для получения информации о текущем поло-
жении курсора мыши и о количестве нажатий/отпусканий указанной клавиши. Счетчик нажатий обнуляется после каждого чтения.
Обращение:
АХ = 5 (для опр. числа нажатий)
АХ = 6 (для опр. числа отпусканий)
ВХ - номер клавиши для контроля
0 - левая кнопка
1 - правая кнопка
Возвращает: АХ - текущее состояние клавиши
бит 0 = 1 нажатие левой клавиши
бит 0 = 1 нажатие правой клавиши
ВХ - число нажатий на кнопку со
времени последнего опроса
СХ - Х - координата в момент
последнего нажатия (отпускания)
клавиши
DX - то же для Y координаты
ФУНКЦИЯ 0BH
ПОЛУЧИТЬ ЗНАЧЕНИЕ ОТНОСИТЕЛЬНОГО
ПЕРЕМЕЩЕНИЯ
Возвращает значения счетчиков по X и Y с момента последнего опроса мыши. После выполнения функции значения
счетчиков обнуляются.
Обращение:
АХ=0BH
Возвращает: СХ - относительное перемещение по оси X
DX - то же для оси Y
Пример оформления программы
program test_mouse;
const no_mouse:string = 'no mouse$";
two:string = 'two$';
some:string = 'some$';
var
npress,x,y:word;
begin
asm
push ds
sub ax,ax
int 33h
mov word ptr exitcode,ax
cmp ax,0FFFFh
jne @no_m
mov ah,9
cmp bx,0
je
@some
mov dx,offset two[1]
jmp @put
@some: mov dx,offset some[1]
@put:
int 21h
mov ax,5
sub bx,bx
int 33h
mov word ptr NPess,bx
mov word ptr X,cx
mov word ptr Y,dx
jmp @quit
@no_m: mov dx,offset no_mouse[1]
mov ah,9
int 21h
@quit: pop ds
end;
if exitcode = $FFFF then writeln('Press: ',NPress,', x=',x,', y=', у);
end.
Download