КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Общие понятия. Лекция 7. Ввод с клавиатурыЛекция 7. Ввод с клавиатуры Прямая работа с видеопамятью Все, что изображено на мониторе — и графика, и текст, одновременно присутствует в памяти, встроенной в видеоадаптер. Для того чтобы изображение появилось на мониторе, оно должно быть записано в память видеоадаптера. Для этого отводится специальная область памяти, начинающаяся с абсолютного адреса B800h:0000h (для текстовых режимов) и заканчивающаяся на B800h:FFFFh. Все, что программы пишут в эту область памяти, немедленно пересылается в память видеоадаптера. В текстовых режимах для хранения каждого изображенного символа используются два байта: байт с ASCII-кодом символа и байт с его атрибутом, так что по адресу B800h:0000h лежит байт с кодом символа, находящимся в верхнем левом углу экрана; по адресу B800h:0001h лежит атрибут этого символа; по адресу B800h:0002h лежит код второго символа в верхней строке экрана и т.д. Таким образом, любая программа может вывести текст на экран простой командой пересылки данных, не прибегая ни к каким специальным функциям DOS или BIOS. Пример: ; используя прямой вывод на экран .model tiny .code org 100h; начало СОМ-файла start: mov ax,0003h int 10h; видеорежим 3 (очистка экрана) cld; обработка строк в прямом направлении ; подготовка данных для вывода на экран mov ах,1F00h; первый символ 00 с атрибутом 1Fh, ; затем пробел (20h) с атрибутом 1Fh mov bx,0F20h; пробел с атрибутом 0Fh mov cx,255; число символов минус 1 mov di,offset ctable; ES:DI - начало таблицы cloop: stosw; записать символ и пробел в таблицу ctable xchg ax, bx stosw xchg ax, bx pop ax inc al; AL содержит следующий символ test cx,0Fh; если СХ не кратен 16, jnz continue_loop; продолжить цикл, push cx; иначе: сохранить значение счетчика mov cx,80-32; число оставшихся до конца строки символов xchg ax, bx rep stosw; заполнить остаток строки пробелами ; с атрибутом 0F xchg bx, ax; восстановить значение ЕАХ pop cx; восстановить значение счетчика continue_loop: loop cloop stosw; записать последний (256-й) символ и пробел xchg ax, bx stosw
; собственно вывод на экран mov ax,0B800h; сегментный адрес видеопамяти mov es,ax xor di,di; DI = 0, адрес начала видеопамяти в ES:DI mov si,offset ctable; адрес таблицы в DS:SI mov cx,15*80+32; 15 строк по 80 симв., посл. строка - 32 rep movsw; скопировать таблицу ctable в видеопамять ret; завершение СОМ-файла ctable:; Данные для вывода на экран начинаются сразу ; за концом файла. В ЕХЕ-файле такие данные ; определяют в сегменте.data? end start Клавиатура подключена к линии прерывания INT 09h. Нажатие на любую кнопку, или отпускание кнопки клавиатуры вызывает прерывание INT 09h. Клавиатурное прерывание обслуживается модулями BIOS. Драйверы клавиатуры и резидентные программы могут организовывать дополнительную обработку прерывания INT 09h. Для этого может быть использована цепочка обработчиков прерывания. Стандартный обработчик выполняет следующие действия: • читает из порта клавиа скан-код нажатой клавиши; записывает вычисленное по скан-коду значение ASCII-кода нажатой клавиши в специальный буфер клавиатуры, расположенный в области данных BIOS; корректно завершает обработку аппаратного прерывания. Обработчик прерывания INT 09h не просто записывает значение ASCII-кода в буфер клавиатуры. Дополнительно отслеживаются нажатия таких комбинаций клавиш, как Ctrl-Alt-Del, обрабатываются специальные клавиши PrtSc и SysReq. При вычислении кода ASCII нажатой клавиши учитывается состояние клавиш Shift и CapsLock.
В памяти выделены специальные адреса для храниения данных клавиатуры. Байт состояния клавиатуры 1 (этот байт всегда расположен в памяти по адресу 0000h:0417h или 0040h:0017h): Бит 7: Ins включена Бит 6: CapsLock включена Бит 5: NumLock включена Бит 4: ScrollLock включена Бит 3: Alt нажата (любая Alt для функции 02h, часто только левая Alt для 12h/22h) Бит 2: Ctrl нажата (любая Ctrl) Бит 1: Левая Shift нажата Бит 0: Правая Shift нажата Байт состояния клавиатуры 2 (этот байт всегда расположен в памяти по адресу 0000h:0418h или 0040h:0018h): Бит 7: SysRq нажата Бит 6: CapsLock нажата Бит 5: NumLock нажата Бит 4: ScrollLock нажата Бит 3: Правая Alt нажата Бит 2: Правая Ctrl нажата Бит 1: Левая Alt нажата Бит 0: Левая Ctrl нажата Оба этих байта постоянно располагаются в памяти, так что вместо вызова прерывания часто удобнее просто считывать значения напрямую
Помимо этих двух байт BIOS хранит в своей области данных и весь клавиатурный буфер, к которому также можно обращаться напрямую. Буфер занимает 16 слов с 0h:041Eh no 0h:043Dh включительно, причем по адресу 0h:041Ah лежит адрес (ближний) начала буфера, то есть адрес, по которому располагается следующий введенный символ, а по адресу 0h:041Ch лежит адрес конца буфера, так что если эти два адреса равны, буфер пуст. Буфер действует как кольцо: если начало буфера — 043Ch, а конец — 0420h, то в буфере находятся три символа по адресам 043Ch, 041Eh и 0420h. Каждый символ хранится в виде слова — того же самого, которое возвращает функция 10h прерывания INT 16h. В некоторых случаях (если) буфер размещается по другим адресам, тогда адрес его начала хранится в области данных BIOS по адресу 0480h, а конца — по адресу 0482h. Прямой доступ к буферу клавиатуры лишь немногим быстрее, чем вызов соответствующих функций BIOS, и для приложений, требующих максимальной скорости, таких как игры или демо-программы, используют управление клавиатурой на уровне портов ввода-вывода.
Дата добавления: 2014-01-05; Просмотров: 266; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |