ВВЕДЕН?Е
Мой курсовой
проект посвящается созданию программы, рисующей линии между
контурными точками, расставляемыми в
местах, где была нажата левая кнопка
мыши. Это простейший пример, способный показать, что для
демонстрации некоторых функций работы мыши актуальным является
применение языка программирования «Ассемблер».
Мышь – устройство ввода, получившее
очень большую популярность. Трудно
представить себе современный компьютер без мыши или эквивалентного ей
указывающего устройства. В качестве эквивалентного устройства может быть
планшетка или разного рода сенсорные площадки, где управление осуществляется
пластмассовым карандашом или непосредственно пальцем пользователя.
1 ОБЩ?Й РАЗДЕЛ
Устройство для
ручного ввода графической информации в вычислительную машину, лишь много позже
получившее своё современное название, было придумано, сконструировано и
запатентовано Дугласом Энгельбартом из Стэнфордского университета в середине
60-ых годов прошлого века. Энгельбарт, известный также как автор графического
пользовательского интерфейса и один из первых разработчиков гипертекстовой
"нивы", был пионером, так что дальше довольно громоздкого и
неудобного прототипа его мысль не пошла. Честь превращения
мыши из коробки на двух наружных колёсах в конструкцию, которую сегодня уже начинают забывать - коробочку с шариком, также
вращавшим пару роликов, но помещённых внутри - принадлежит работникам
лаборатории Xerox PARC, сделавшим это в начале 70-ых гг. Наконец, облекли мышку
в привлекательную внешне форму и выпустили на массовый рынок исследователи
швейцарского Н?? с труднопроизносимым названием (сокращаемым до EPFL),
работавшие в организованной ими и знакомой сегодня
каждому компании Logitech.
Шли годы, менялись
внешний вид и количество кнопок (в конструкции Энгельбарта была только одна
клавиша, и этот вариант был сравнительно популярен,
в частности, на платформе Mac), а принцип работы манипулятора
оставался прежним. Шарик собирал
пыль, механическая конструкция была инерционной и неточной, и неудивительно, что
в один прекрасный день в чью-то светлую голову пришла идея
избавиться от механики, переложив
задачу слежения за движениями руки пользователя
на плечи электроники и оптики. Ранний период развития
варианта мыши, получившей название оптической, связывают
с именем неутомимого американского предпринимателя
Стивена Кирша (известного, в частности, как основатель Infoseek Corp.). Это он
придумал и запатентовал в начале 80-ых годов манипулятор,
определявший направление движения с помощью простого оптического сенсора. Мышь Кирша
могла работать только на специальном металлическом коврике, покрытом сеткой
тёмных полос: она освещала коврик и следила за яркостью
отражений, определяя
траекторию по пересечениям полос.
Ранняя
эта конструкция так и не получила
массового признания. Потребовались
ещё почти двадцать лет развития
электроники, для того чтобы
оптические мыши смогли составить конкуренцию своим механическим предкам.
Впрочем, современные оптические мыши устроены во многом схоже с киршевской. Они
включают три основных элемента: светодиод, освещающий рабочую площадку,
оптический сенсор в виде простейшей матрицы светочувствительных элементов
(похожей на матрицу в цифровых фотоаппаратах, но значительно меньшего разрешения - примерно 16 х 16 пикселей), и сигнальный
микропроцессор (DSP), умеющий распознавать образы. "Фотографируя" поверхность под собой полторы тысячи раз в секунду, оптическая
мышь с помощью чипа DSP улавливает смещения
картинки и подаёт соответствующие сигналы компьютеру. Работают такие мыши
практически на любой поверхности, исключая
лишь зеркальные, полированные и поверхности с крупноволокнистой фактурой.
Точность позиционирования, почти
нулевая инерционность, отсутствие
необходимости в чистке - всё это помогло оптическим мышам вытеснить своих
предшественниц с рабочих столов. ? здесь мы подходим к тому, с чего всё
собственно и началось. Уже знакомая
вам компания Logitech представила на
минувшей неделе компьютерную мышь новой конструкции. Строго говоря, Logitech MX1000 Laser Cordless Mouse относится к оптическому племени, но вместо светодиода в ней
установлен миниатюрный полупроводниковый лазер, улучшена разрешающая способность фотосенсора. Принцип действия остался
прежним, так что посвящать ему
отдельный абзац нет необходимости. Чем лазерная
мышь лучше оптической? Абсолютной неприхотливостью: она способна работать даже
на зеркале благодаря свойствам
лазерного излучения и новой
оптической системе. Тем же самым она обязана
и непревзойдённой точности: MX1000 различает в 20 раз больше деталей, чем
обычная оптическая мышь. Стоит такая
машинка почти 80 долларов. Вопрос в том, считать ли лазерную мышь Logitech
новой ветвью на эволюционном древе (авторитет компании - аргумент в пользу) или
это обычный маркетинговый ход с добавлением никому не нужной функции, для того чтобы выделиться
средь толпы производителей? В самом деле, зачем вам двадцатикратное улучшение и
без того более чем приемлемой точности?
2 ОП?САН?Е УСТРОЙСТВА
2.1 ОП?САН?Е МЫШ?
Популярность мышек заставила производителей серьезно
задуматься о модернизации своих
продуктов. В результате мы получили несколько типов мышек: механических,
оптических, беспроводных оптических, беспроводных механических. В механических
мышках для определения расстояния, на которое она переместилась, используются механические системы оповещения, в которых механическое вращение вертикальной,
горизонтальной и диагональной осей преобразуются
в сигналы, передаваемые на контроллер. В оптических мышках используются мощный светодиод, по отражению луча которого от
поверхности, на которой находится
мышка рассчитывается расстояния, на
которое она переместилась,. Наличием колесика прокрутки уже трудно кого-либо
удивить, зато в списках рейтингов можно увидеть мультимедийные мышки,
сочетающие в себе все приемущества передовых разработок. При использовании
такой мышки каждый палец задействован в работе для
ее удобства и ускорения. Теперь без
лишних движений мыши вы можете сворачивать, разворачивать, закрывать окна,
управлять проигрывателем музыки или
видео. При просмотре изображений вы можете без затруднения
пролистывать их, изменять размеры и
т. п.
Мышь состоит из 3-х частей: внешней
оболочки (обычно пластмассовой, в области которой находятся кнопки и колесики прокрутки), блока микросхем
(имеет прямое подключение к порту
компьютера, передает сигналы от мыши), механической или оптической части
(служит для определения расстояния, на которое мышь переместилась).
Современная мышь смогла избавить нас от рутинной работы,
лишних движений и таких неприятных
вещей как чистка механических элементов от накопившейся
грязи…
Не трудно
догадаться, что для такого набора функций понадобятся
нестандартные драйверы, (система может установить свои версии, но они
предназначены для использования лишь стандартных функций. По-умолчанию (в самых
последних версиях операционных систем,
таких как Windows XP, Windows Longhorn) эти драйверы могут использовать
левую, правую кнопки, колесико прокрутки и до двух кнопок навигации для упрощения
работы в сети ?нтернет.). ?х можно найти в коробке с устройством. Эти драйверы
позволяют мышку работать корректно и
использовать полный спектр функций, предусмотренных производителем. В панели
управления на вкладке «Мышь» становятся
доступными настройки новых функций.
2.2 ПРОГРАММНАЯ МОДЕЛЬ МЫШ?
Все общение с мышью в DOS выполняется через прерывание ЗЗh,обработчик которого устанавливает драйвер мыши, загружаемый обычно
при запуске системы. Современные драйверы поддерживают около 60 функций,
позволяющих настраивать разрешение
мыши, профили ускорений, виртуальные координаты, дополнительные обработчики
событий и т. п. Большинство этих функций требуются редко,
сейчас рассмотрим основные.
INT33h, АХ=0: ?нициализация мыши Вход: АХ = OOOOh Выход: АХ = OOOOh, если мышь или драйвер мыши не установлены
АХ = OFFFFh, если драйвер и мышь установлены
ВХ = число
кнопок:
2
или OFFFFh - две
3
- три
0000 - другое количество Выполняется аппаратный и программный сброс мыши и драйвера.
INT33h, AX=1: Показать курсор Вход: АХ - 000 lh
INT33h, AX = 2: Спрятать
курсор Вход: АХ = 0002h
Драйвер мыши поддерживает внутренний
счетчик, управляющий видимостью курсора мыши.
Функция 2 уменьшает значение
счетчика на единицу, а функция 1 увеличивает его, но только до значения 0. Если значение счетчика - отрицательное число, он спрятан,
если ноль - показан. Это позволяет
процедурам, использующим прямой вывод в видеопамять,
вызывать функцию 2 в самом начале и 1 в самом конце, не заботясь о
том, в каком состоянии был курсор
мыши у вызвавшей эту процедуру
программы.
INT33h, AX = 3: Определить состояние мыши Вход:
АХ - ОООЗh Выход: ВХ - состояние
кнопок:
бит 0. нажата
левая кнопка
бит 1: нажата
правая кнопка
бит 2: нажата
средняя
кнопка
Х-координата
Y-координата
Возвращаемые координаты совпадают с
координатами пикселов соответствующей точки на экране в большинстве графических
режимов, «роме 04, 05, ODh, 13h, где Х-координату мыши нужно разделить на 2, чтобы
получить номер столбца соответствующей точки на экране. В текстовых режимах
oбе координаты надо разделить на 8
для получения
номера строки и столбца соответственно.
В большинстве случаев эта функция не используется
в npoграммах, так как для того, чтобы реагировать на нажатие кнопки или перемещение мыши в заданную
область, требуется
вызывать это прерывание постоянно,
что приводит к трате процессорного времени. Функции 5 (определить положение
курсора при последнем нажатии кнопки), 6 (определить положение курсора
при последнем отпускании кнопки) и OBh (определить расстояние,
пройденное мшью) могут помочь оптимизировать работу программы, самостоятельно «следящей»
за всеми передвижениями мыши, но
гораздо эффективнее указать драйверу контролировать ее передвижения (чем он, собственно, и занимается постоянно)
и передавать управление в программу, как только выполнится заранее определенное условие, например пользователь
нажмет на левую кнопку мыши. Такой сервис обеспечивает функция 0Сh - установить
обработчик событий.
INT 33h, AX = 0Сh: Установить обработчик событий Вход: АХ = 000Ch
ES:DX = адрес обработчика СХ = условие вызова
бит 0: любое перемещение мыши
бит 1: нажатие
левой кнопки
бит 2:
отпускание левой кнопки
бит 3: нажатие
правой кнопки
бит 4:
отпускание правой кнопки
бит 5: нажатие
средней кнопки
бит 6: отпускание средней кнопки СХ = 0000h - отменить обработчик
Обработчик событий должен быть оформлен, как дальняя
процедура (то есть завершаться командой RETF). На входе в процедуру обработчика АХ содержит условие вызова, ВХ - состояние кнопок, СХ, DX - Х- и У-координаты курсора, SI, DI - счетчики
последнего перемещения по
горизонтали и Вертикали (единицы измерения
для этих счетчиков - мики, 1/200
дюйма), DS - сегмент данных драйвера мыши. Перед завершением
программы установленный обработчик событий должен быть обязательно удален (вызов функции 0Сh с СХ= 0). так как иначе при первом же выполнении условия управление будет передано по адресу в памяти, с которого начинался
обработчик.
Функция
0Сh используется
так часто, что у нее появилось
несколько модификаций -
функция 14h, дающая
возможность установить одновременно три обработчика
с разными условиями, и функция 18h, также позволяющая
установить
3 РАЗРАБОТКА АЛГОР?ТМА УПРАВЛЕН?Я МЫШЬЮ
Схема обработки
прерываний:
Обработка
прерываний осуществляется с помощью специального процессора, производящего предварительную обработку запросов на прерывания. Выбирается
запрос с наибольшим приоритетом, а затем уже обращается
к процессору, т.е. на выходе INTR подключен контроллер прерываний, а к нему уже подключается внешнее устройство. Немаскируемое прерывание связано с процессором. Таймер обращается к процессору напрямую.
Запрос на прерывание внешнее устройство посылает на контроллер прерываний ,
который затем посылает запрос по линии INTR на процессор, анализирующий флаг
прерывания, если он равен 1, то по
линии INTA идет
подтверждение готовности обработать запрос. После этого через шину данных контроллер
прерываний формирует команду INT с соответствующим номером прерывания.
Далее процессор обрабатывает эту команду и передает управление на обработчик
прерывания, который взаимодействует
с устройством, вызвавшим это прерывание через шину данных и адреса, а также
через порты, к которым подсоединено устройство и его контроллер.
4 РАЗРАБОТКА ? РЕАЛ?ЗАЦ?Я ПРОГРАММНОГО ОБЕСПЕЧЕН?Я
Для работы моей программы
требуется IBM совместимый компьютер на базе процессора
Intel и любая возможная
техническая конфигурация для
запуска операционной системы DOS. Программа занимает не более 500 байт оперативной памяти. Также потребуется
предварительно откомпилированный исполняемый
файл программы. Пользователю нужно запустить программу и нажать левую кнопку
мышки в разных местах экрана для
проверки работоспособности программы. Если между точками в которых были
произведены нажатия рисуются лини, то программа работает корректно.
?сходный код программы представлен в приложении А.
Блок-схема представлена в приложении Б.
5 ОТЛАДКА ? ?СПЫТАН?Е ПРОГРАММЫ
Перед запуском
программы следует убедиться в том,
что к компьютеру подсоединена мышь, включить компьютер, запустить программу в
16-битной среде, нажать левую кнопку мыши в разных местах экрана. Программа
может работать некорректно при условии несоблюдения
вышеуказанных условий.
В процессе
испытаний программа работала корректно, трудностей с компиляцией и отладкой не возникло.
ЗАКЛЮЧЕН?Е
В процессе выполнения данного курсового проекта я
ознакомился с устройствами разных
типов мышек, с их программными моделями.
Научился писать простейшее
программное обеспечение, использующее некоторые функции мыши. Разработал
алгоритм управления устройством,
написал, отладил и экспериментально проверил функциональность программы.
Л?ТЕРАТУРА
1. Абель
П. и программирования/ Пер. с англ.
Ю. В. Сальникова.- М.: Высш. Шк. 1992г. – 447с.: ил.
2. А. Жуков, А. Авдохин
«Assembler».-Спб: БХВ – Петербург, 2002..
3.
Архитектура
ввода-вывода персональных ЭВМ IBM PC Под pедакцией Ю. С. Лукача (C)
?нженеpно-техническое бюpо, 1990
4.
В.
Юров «Assembler» Практикум.-Спб.:Питер, 2001.
5.
В.
Юров «Assembler» Учебник.-Спб.:Питер, 2001.
6.
?рвин,
Кип. Язык Ассемблера для процессоров
Intel, 3-е издание: Пер. с англ. - М.: ?здательский дом «Вильямс», 2002.-616с.: ил. - Парал. Тит. Англ.
7. ?спользование
Turbo Assembler при разработке программ / Сост. А. А.
Чекатков.-Киев:Диалектика,1995.-228с
Приложение
А
; mousedr.asm
; Рисует на экране прямые линии с концами в позициях,
указываемых мышью
.model tiny
.code
start:
mov ax,12h
int 10h ;
видеорежим 640x480
mov ax,0 ; инициализировать мышь
int 33h
mov ax,1 ; показать курсор мыши
int 33h
mov ax,000Ch ; установить обработчик событий мыши
mov cx,0002h ; событие - нажатие левой кнопки
mov dx,offset handler ; ES:DX - адрес обработчика
int 33h
mov ah,0 ; ожидание нажатия любой клавиши
int 16h
mov ax,000Ch
mov cx,0000h ; удалить обработчик событий мыши
int 33h
mov ax,3 ; текстовый режим
int 10h
ret ;
конец программы
; Обработчик событий
мыши: при первом нажатии выводит точку на экран,
; при каждом дальнейшем
вызове проводит прямую линию от
предыдущей точки к
; текущей
handler:
push 0A000h
pop es ;
ES
- начало видеопамяти
push cs
pop ds ; DS - сегмент кода и данных этой
программы
push cx ; CX (X-координата) и
push dx ; DX (Y-координата) потребуются в конце
mov ax,2 ; спрятать
курсор мыши перед выводом на экран
int 33h
cmp word ptr
previous_X,-1 ; если это первый
вызов,
je first_point ; только вывести точку,
call line_bresenham ; иначе - провести прямую
exit_handler:
pop dx ; восстановить CX и DX
pop cx
mov previous_X,cx ; и запомнить их как предыдущие
mov previous_Y,dx ;
координаты
mov ax,1 ; показать курсор мыши
int 33h
retf ;
выход из обработчика - команда RETF
first_point:
call putpixel1b ; вывод одной точки (при первом вызове)
jmp short exit_handler
; Процедура рисования прямой
линии с использованием алгоритма Брезенхама
; Ввод: CX,DX - X, Y
конечной точки
; previous_X,previous_Y - X, Y начальной точки
line_bresenham:
mov ax,cx
sub ax,previous_X ; AX = длина
проекции прямой на ось X
jns dx_pos ;
если AX отрицательный -
neg ax ; сменить его
знак, причем
mov word ptr X_increment,1 ; координата X при выводе
jmp short dx_neg ;
прямой будет расти,
dx_pos: mov word ptr X_increment,-1 ; а иначе - уменьшаться
dx_neg: mov bx,dx
sub bx,previous_Y ; BX = длина проекции прямой на ось Y
jns dy_pos ; если BX
отрицательный -
neg bx ; сменить его
знак, причем
mov word ptr
Y_increment,1 ; координата Y при
выводе
jmp short dy_neg ;
прямой будет расти,
dy_pos: mov word ptr Y_increment,-1 ; а
иначе - уменьшаться
dy_neg:
shl ax,1 ; удвоить значения проекций,
shl bx,1 ; чтобы избежать работы с полуцелыми
числами
call putpixel1b ; вывести первую точку (прямая
рисуется от
; CX,DX к previous_X,previous_Y
cmp ax,bx ;
если проекция на ось X больше, чем
на Y:
jna dx_le_dy
mov di,ax ; DI будет указывать, в какую сторону
мы
shr di,1 ; отклонились от идеальной прямой
neg di ; оптимальное начальное значение
DI:
add di,bx ;
DI = 2 * dy - dx.
cycle:
cmp cx,word ptr previous_X ; основной цикл выполняется,
je exit_bres ;
пока X не станет равно previous_X
cmp di,0 ;
если DI > 0,
jl fractlt0
add dx,word ptr Y_increment ;
перейти к следующему Y
sub di,ax ;
и уменьшить DI на 2 * dx
fractlt0:
add cx,word ptr
X_increment ; следующий X (на каждом
шаге)
add di,bx ; увеличить DI на 2 * dy
call putpixel1b ; вывести точку
jmp short cycle ;
продолжить цикл
dx_le_dy: ; если проекция на ось Y больше, чем на X
mov di,bx
shr di,1
neg di ;
оптимальное начальное значение DI:
add di,ax ;
DI = 2 * dx - dy
cycle2:
cmp dx,word ptr previous_Y ; основной цикл выполняется,
je exit_bres ;
пока Y не станет равным previous_Y,
cmp di,0 ;
если DI > 0
jl fractlt02
add cx,word ptr X_increment ; перейти к следующему X
sub di,bx ;
и уменьшить DI на 2 * dy
fractlt02:
add dx,word ptr
Y_increment ; следующий Y (на каждом
шаге)
add di,ax ; увеличить DI на 2 * dy
call putpix ось Y
больше, чем на X
mov di,bx
shr di,1
neg di ;
оптимальное начальное значение DI:
add di,ax ;
DI = 2 * dx - dy
cycle2:
cmp dx,word ptr previous_Y ; основной цикл выполняется,
je exit_bres ;
пока Y не станет равным previous_Y,
cmp di,0 ;
если DI > 0
jl fractlt02
add cx,word ptr X_increment ; перейти к следующему X
sub di,bx ;
и уменьшить DI на 2 * dy
fractlt02:
add dx,word ptr
Y_increment ; следующий Y (на каждом
шаге)
add di,ax ;
увеличить DI на 2 * dy
call putpixi,ax ; поместить его в SI и DI для команд
mov si,di ; строковой обработки
pop cx ; CX снова содержит номер столбца
mov bx,0080h
and cx,07h ; последние три бита CX =
; остаток от деления на 8 =
; номер бита в байте,
считая справа налево
shr bx,cl ; теперь в BL установлен в 1 нужный
бит
lods es:byte
ptr
some_label ;
AL
= байт из видеопамяти
or ax,bx ; установить выводимый бит в 1
; чтобы стереть пиксель
с экрана, эту команду OR можно заменить на
; not bx
; and ax,bx
; или лучше
инициализировать BX не числом 0080h, а числом FF7Fh и ; использовать только and
stosb ;
и вернем байт на место
popa ;
восстановим регистры
ret ;
конец
previous_X dw -1 ; предыдущая
X-координата
previous_Y dw -1 ; предыдущая
Y-координата
Y_increment dw -1 ; направление изменения Y
X_increment dw -1 ; направление изменения X
some_label: ; метка, используемая для
переопределения
; сегмента-источника для lods с DS на ES
end start
Приложение Б
Установка обработчика событий мыши
|
Блок-схема:
ВВЕДЕН?Е
Мой курсовой
проект посвящается созданию программы, рисующей линии между
контурными точками, расставляемыми в
мес