https://github.com/tsnsoft/pascal_demo_keyboard
Пример программ на Pascal для работы с клавиатурой на низком уровне
https://github.com/tsnsoft/pascal_demo_keyboard
asm interrupts keyboard oldschool pascal port
Last synced: 5 months ago
JSON representation
Пример программ на Pascal для работы с клавиатурой на низком уровне
- Host: GitHub
- URL: https://github.com/tsnsoft/pascal_demo_keyboard
- Owner: tsnsoft
- License: gpl-3.0
- Created: 2018-04-27T08:05:17.000Z (about 8 years ago)
- Default Branch: master
- Last Pushed: 2018-04-27T08:16:03.000Z (about 8 years ago)
- Last Synced: 2025-06-12T21:54:58.647Z (about 1 year ago)
- Topics: asm, interrupts, keyboard, oldschool, pascal, port
- Language: Pascal
- Size: 231 KB
- Stars: 5
- Watchers: 0
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# PASCAL_DEMO_KEYBOARD
Пример программ на Pascal для работы с клавиатурой на низком уровне (1996г., времена MS-DOS и PASCAL...)
[1] ВВЕДЕНИЕ.
*************
Что такое современная клавиатура компьютера IBM AT ?
Прежде чем начать изучать этот вопрос нам необходимо знать: а что же
такое компьютер вообще, из чего он состоит ?
[1.1] Основные компоненты компьютера.
=====================================
Компьютер состоит из 5 основных компонент:
1) Системный блок;
2) Накопитель на жестком диске;
3) Накопитель на гибком диске;
4) Дисплей;
5) Клавиатура;
Совокупность этих и некоторых других компонент и образует компьютер
как таковой. Все компоненты компьютера соединяются между собой с
помощью специальных кабелей, представляющих из себя набор проводников
в специальной изоляции с разъемами на концах.
1> Системный блок - это основная компонента компьютера,
представляющая из себя совокупность металлического четырехугольного
корпуса с электронной начинкой внутри.
Назначение системного блока:
1) Выполняет компьютерные программы;
2) Является вместилищем основных электронных плат компьютера и
нескольких компонент компьютера: это накопитель на жестком диске,
накопитель на гибком диске и др. Все компоненты системного блока
прикручиваются к нему шурупами и соединяются между собой при
помощи кабелей;
3) Содержит блок питания, который обеспечивает электронные платы
системного блока электрической энергией;
4) Содержит вентилятор, который охлаждает электронную начинку
системного блока, которая вышла бы без него из строя от перегрева;
5) Содержит несколько миниатюрных индикаторов (лампочек), которые
отображают значения некоторых характеристик и состояний
компьютера:
- индикатор, показывающий текущую скорость работы компьютера;
- лампочка "Power", свечение которой означает, что компьютер
включен;
- лампочка "Turbo", свечение которой означает, что компьютер
работает с максимальной скоростью;
- лампочка "H/Disk", свечение которой означает, что в данный
момент происходит работа накопителя на жестком диске;
6) Содержит несколько органов управления компьютером:
- кнопку включения/выключения компьютера: "Power";
- кнопку начальной установки компьютера: "Reset" ("сброс");
- кнопку переключения скорости работы компьютера: "Turbo";
- замок, при закрытии которого работа на компьютере невозможна;
2> Накопитель на жестком диске - это важная компонента компьютера,
находящаяся внутри системного блока.
Назначение накопителя на жестком диске:
1) Позволяет постоянно (даже при отключении питания) хранить
большое количество информации, данных и программ.
2) Хранит специальную информацию и программы, без которых
компьютер при включении работать не будет (так называемую "DOS" и
др.);
3> Накопитель на гибком диске - это нужная компонента компьютера,
находящаяся внутри системного блока. Накопитель на гибком диске
служит для работы с дискетами и позволяет записывать и считывать
информацию с них.
Дискеты - это специальные пластины с магнитным покрытием (это
покрытие подобно покрытию магнитофонных кассет), которые способны
сохранять записанную на них информацию в течении долгого времени.
Дискеты позволяют обмениваться информацией между компьютерами, а
также хранить резервные копии информации, данных и программ, которые
могут понадобиться для их восстановления на жестком диске (если они
там уничтожатся или разрушатся);
4> Дисплей - это необходимая компонента компьютера, находящаяся вне
системного блока и представляющая из себя подобие обыкновенного
телевизора. Назначение дисплея в том, чтобы пользователь компьютера
мог зрительно с ним общаться и взаимодействовать.
5> Клавиатура - это необходимая компонента компьютера, находящаяся
вне системного блока и представляющая из себя корпус небольшой высоты
с электронной начинкой внутри. В клавиатуру вделан набор клавиш и
индикаторов (миниатюрных лампочек, отражающих некоторые режимы работы
клавиатуры). Назначение клавиатуры в том, чтобы пользователь
компьютера мог с помощью пальцев рук общаться и взаимодействовать с
ним.
* * * * * * *
[1.2] Понятия, без которых не обойтись.
=======================================
1) Клавиши - этим термином будем обозначать набор клавиш, которые
вделаны в корпус клавиатуры и представляют из себя миниатюрные
переключатели, замыкающие электронные цепи при их нажатии и
размыкающие при их отпускании.
2) Контроллер клавиатуры - это одна из важнейших микросхем
электронной начинки клавиатуры, с помощью которой происходит
"общение" системного блока с клавиатурой.
Назначение контроллера клавиатуры:
- управляет всей электроникой клавиатуры;
- передает системному блоку информацию о фактах нажатий и отжатий
клавиш;
- передает системному блоку информацию о состоянии электроники
клавиатуры;
- принимает и исполняет команды системного блока;
3) Центральный процессор - это "мозг" компьютера, представляющий из
себя очень сложную и большую по размерам электронную микросхему.
Центральный процессор предназначен для управления компьютером и с
помощью него системный блок выполняет компьютерные программы.
4) Оперативная память - это необходимая компонента компьютера,
которая предназначена для хранения данных и программ во время работы
компьютера. Без оперативной памяти компьютер работать не может. После
выключения питания компьютера все данные из оперативной памяти
стираются.
5) Буфер клавиатуры - это небольшая оперативная память, находящаяся
в электронике клавиатуры. В этой памяти храниться информация о тех
фактах нажатий и отжатий клавиш, которые были, но еще не переданы в
системный блок. Буфер клавиатуры состоит из 15 ячеек, каждая из
которых может содержать число от 0 до 255.
6) Системный буфер клавиатуры (СБК) - это часть оперативной памяти
системного блока, в которой хранятся данные, которые получены путем
анализа той информации (о фактах нажатий и отжатий клавиш) буфера
клавиатуры, которую системный блок получил от клавиатуры (а именно от
контроллера клавиатуры). Системный буфер клавиатуры состоит из 16
ячеек, каждая из которых может содержать два числа, каждое из которых
может принимать значения от 0 до 255.
7) BIOS - это набор специальных программ, постоянно хранящихся в
памяти компьютера (системного блока), которые после выключения
питания не стираются. Эти программы непосредственно управляют
электроникой компьютера и без этих программ компьютер работать не
может. Использование возможностей этих программ делает
программирование более простым и быстрым.
8) Порты ввода/вывода информации - это специальные микросхемы,
которые соединяют электронику различных компонент компьютера
(например дисплея и системного блока) между собой. Порты являются как
бы "воротами" компьютера, через которые проходят потоки различной
информации. Каждый порт имеет свой индивидуальный номер, с помощью
которого мы можем узнать и изменить все те потоки информации, которые
через него проходят. Необходимо заметить, что и клавиатура
взаимодействует с компьютером (системным блоком) тоже через порты
ввода/вывода информации.
9) Прерывание - это процесс, состоящий из трех основных этапов:
1) Компьютер запоминает свое текущее состояние (чтобы после в
него вернуться) и прекращает свою текущую работу;
2) Начинает выполняться одна из специальных программ, которая
определяется номером прерывания (каждое прерывание имеет свой
индивидуальный номер);
3) После выполнения специальной программы, выполняющей
(обслуживающей) данное прерывание, компьютер восстанавливает свое
предыдущее состояние (которое было предварительно запомнено), и
начинает продолжать свою предыдущую работу с того места, где
прежде он остановился;
- - - - - - -
При обозначении цифр будем использовать следующее правило: если после
цифры стоит буква 'd' или ничего не стоит, то цифра написана в
десятичной системе исчисления, а если после цифры стоит буква 'h', то
цифра написана в шестнадцатеричной системе.
- - - - - - -
Теперь перейдем к знакомству с клавиатурой.
* * * * * * *
[2] ЗНАКОМСТВО С КЛАВИАТУРОЙ.
*****************************
Клавиатура - это устройство для ввода информации в компьютер с
помощью пальцев рук. Клавиатура состоит из набора клавиш (с помощью
которых, собственно, и осуществляется ввод информации) и электроники,
которая их обслуживает. Главной частью клавиатурной электроники
является контроллер клавиатуры, связывающий системный блок компьютера
с остальной электроникой клавиатуры.
Все клавиши клавиатуры можно разделить на 3 группы:
1) Символьные - служат для ввода компьютерных символов: букв,цифр,
знаков препинания и других символов (например: "% / # - + = *");
2) Функциональные - служат для выполнения определенных действий,
например для удаления неверно введенного символа, для перемещения
изображения по экрану и др.;
3) Клавиши-переключатели - изменяют режим работы клавиатуры и
назначение некоторых клавиш (например включают или выключают режим
ввода прописных букв и т.д.);
В правой части клавиатуры находятся 17 клавиш, которые имеют свои
аналоги в основной части клавиатуры (например в клавиатуре имеются
две клавиши "Стрелка вправо", две клавиши "Enter" и т.д.). Зачем,
спрашивается, нужно несколько одинаковых по назначению клавиш ?
Хотя это и излишество, но оно очень удобно при работе с клавиатурой
и поэтому клавиатуру мысленно разделяют на две части: основную и
дополнительную. Если говорят о клавишах дополнительной клавиатуры,
то имеют в виду именно 17 клавиш в правой части клавиатуры, а если
говорят просто о клавишах, то имеют ввиду любые клавиши клавиатуры.
Для понимания работы клавиатуры очень важно знать сущность следующих
понятий:
1) Скэн-код клавиши - это условный номер, которые присвоен данной
клавише клавиатуры, т.о. каждая клавиша клавиатуры имеет свой
индивидуальный номер, называемый скэн-кодом.Современная клавиатура
имеет 101 клавишу, а значит и 101 скэн-код (сейчас, правда,
появились некоторые заморские клавиатуры с 102 клавишами, но эти
клавиатуры редки и касаться их мы не будем). Скэн-коды имеют
номера от 1 до 101.
2) Компьютер имеет определенный набор компьютерных символов. Эти
символы подразделяются на буквы (русские и латинские), знаки
препинания (например: ",?!") и специальные символы (например:
"*/-+()%#$&"). Всего в компьютере имеется 256 различных символов.
Каждый компьютерный символ имеет свой определенный порядковый
номер, который представляет из себя число в диапазоне от 0 до 255.
Таким образом, первый компьютерный символ имеет 0 порядковый
номер, второй символ - 1, 256 символ - 255 порядковый номер.
Порядковый номер компьютерного символа называют либо ASCII
кодом, либо расширенным ASCII кодам. Таким образом, например,
порядковый номер символа "R", равный 82, мы можем назвать либо
ASCII кодом, либо расширенными ASCII кодом. Зачем, спрашивается,
нужно два различных названия для одного и того же порядкового
номера символа ? Дело в том, что когда мы нажимаем на к-либо
клавишу клавиатуры, компьютер ставит ей в соответствие к-либо
определенный символ. Например, если нажимается клавиша с
изображенным на ней символом "?", то компьютер поставит ей в
соответствие символ "?". Но если мы нажмем на клавишу "F5", то
компьютер и ей поставит в соответствие символ "?". Но как же нам
в таком случае узнать, какая именно нажималась клавиша при вводе
символа "?": клавиша "F5" или клавиша с изображенным на ней
символом "?" ? Ответ прост: когда мы нажимаем на клавишу с
изображенным на ней символом "?", то компьютер ставит ей в
соответствие символ "?", порядковый номер которого (63) он назовет
ASCII кодом, а когда мы нажимаем на клавишу "F5", то компьютер
поставит и ей в соответствие тот же символ "?", но его порядковый
номер он назовет расширенным ASCII кодом. Поэтому стоит нам только
узнать, как называется порядковый номер введенного с клавиатуры
символа, и мы сразу однозначно определим ту клавишу, которую
нажимали при вводе данного символа. Как узнать название
порядкового номера компьютерного символа мы узнаем позже.
Высказывание "символ с ASCII кодом" равнозначно высказыванию
"порядковый номер символа называется ASCII кодом". Высказывание
"символ с расширенным ASCII кодом" равнозначно высказыванию
"порядковый номер символа называется расширенный ASCII кодом".
Таким образом:
- каждая клавиша имеет свой индивидуальный скэн-код;
- при нажатии к-либо клавиши клавиатуры компьютер (системный блок)
ставит ей в соответствие определенный символ либо с ASCII кодом,
либо с расширенным ASCII кодом;
Каждая клавиша клавиатуры имеет свое назначение по умолчанию, и это
назначение легко может измениться компьютерной программой, т.е.
программным путем.
1> Назначение по умолчанию символьных клавиш состоит в том,чтобы с их
помощью вводить различные символы.
2> Назначение по умолчанию функциональных клавиш :
--------------------------------------------------
Клавиша: Назначение:
-------- -----------
Esc Служит для отмены к-либо действий в программе
(например для завершения работы программы).
F1,F2,...,F12 Специальные клавиши, назначение которых
определяется работающей программой.
PrintScreen При нажатии на эту клавишу содержимое экрана
распечатывается на принтере.
Pause При нажатии на эту клавишу работа компьютера
приостанавливается до нажатия к-либо другой
клавиши.
Home Перемещает курсор в начало строки на экране.
End Перемещает курсор в конец строки на экране.
PgUp (PageUp) Перемещает текст на экране вверх на 25 строк.
PgDn (PageDown) Перемещает текст на экране вниз на 25 строк.
Del (Delete) Эта клавиша стирает тот символ на экране, на
котором находится курсор. Курсор - это специальный
значок на экране, показывающий то место экрана, на
которое будет выводится очередной символ, вводимый
с клавиатуры.
BackSpace Эта клавиша стирает тот символ на экране, который
находится левее курсора.
Стрелки Служат для перемещения курсора по экрану (вверх,
вниз, влево, вправо).
Enter Этой клавишей завершают ввод строк с клавиатуры.
При ее нажатии считается, что вводимая строка
уже набрана.
Tab Перемещает курсор немного вправо по экрану.
3> Назначение по умолчанию клавиш-переключателей :
--------------------------------------------------
Клавиша: Назначение:
-------- -----------
CapsLock Включает/выключает режим ввода прописных букв. Если
установлен режим прописных букв, то вводимые буквы
будут иметь прописной вид, например: "А Б В". Если
режим прописных букв выключен, то вводимые буквы
будут иметь строчный вид, например: "а б в".
NumLock Данной клавишей определяет, как будут
использоваться клавиши дополнительной клавиатуры:
- как цифры (для ввода цифр);
- как клавиши управления курсором (для перемещения
текста и курсора по экрану);
ScrollLock Включает/выключает режим, при котором нажатия на
стрелки будут вызывать перемещение не курсора по
экрану, а изображения (например текста или рисунка)
на нем.
Ins (Insert) Переключает режим вставки/замены символов.
Разберем отличие этих режимов на следующем примере:
пусть на экране имеется строка "Комютер", а курсор
находится на букве "ю"; Теперь нажмем на клавиатуре
на букву "п" и после нее на букву "ь".
Что же получится на экране ?
- если режим вставки, то: "Компьютер".
- если режим замены, то: "Компьер".
Shift Если нажать на эту клавишу и не отпуская ее нажать
на к-либо букву, то
- если установлен режим прописных букв (клавишей
"CapsLock"), то буква введется в строчной форме.
- если установлен режим строчных букв (клавишей
"CapsLock"), то буква введется в прописной форме.
Таким образом эта клавиша временно (пока она
нажата) изменяет тот режим ввода (прописных или
строчных букв), который установлен клавишей
"CapsLock".
Ctrl,Alt Если нажать на одну из этих клавиш и не отпуская
ее нажать на к-либо другую, то назначение второй
нажатой клавиши изменится. Например, если мы просто
нажмем на клавишу "Pause", то результат будет
такой: работа компьютера приостановится до нажатия
к-либо другой клавиши, а если мы сперва нажмем на
клавишу "Ctrl" и не отпуская ее нажмем на клавишу
"Pause", то результат будет совсем другой:
программа, которая в данный момент работает,
завершит свою работу.
* * * * * * *
[3] МЕХАНИЗМ ВЗАИМОДЕЙСТВИЯ КЛАВИАТУРЫ И КОМПЬЮТЕРА.
****************************************************
┌──────────┬────────┬──┐ ┌─────────────────────────────┐
├─┐ │Буфер к.│ │ │ ┌───────────────┐ │
│К│ └────╥───┘ │ │ │ B I O S │ │
│л│ ╔════╗ ┌───╨───┐ │ │ ┌──┼───────────────┤ │
│а│ ║Элек║ │ Intel │ │ │ │П │ Центральный │ │
│в├─╢трон╟──┤8 0 4 2│ │ К а б е л ь │ │о │ Процессор │ │
│и├─╢ика ╟──┤Контрол╞══╪<════════════>╪═══╡р ├───────────────┤ │
│ш├─╫─┬┬─╫──┤лер кла│ │ │ │т │ Оперативная ├────┐ │
│и│ ╟─┼┼─╢ │виатуры│ │ │ │ы │ Память │СБК │ │
├─┘ ╚═╧╧═╝ └───────┘ │ │ └──┴───────────────┴────┘ │
│ К л а в и а т у р а │ │ С и с т е м н ы й б л о к │
└──────────────────────┘ └─────────────────────────────┘
Рис. 1.
При рассмотрения механизма взаимодействия клавиатуры и компьютера
используйте рис.1. Итак:
1) Если системный блок разрешил клавиатуре анализировать факты
нажатий и отпусканий клавиш, то переход на шаг 2, иначе на шаг 1;
2) Если в буфере клавиатуры есть свободное место, то переход на
шаг 3, иначе на шаг 5;
3) Ожидается факт нажатия или отпускания к-либо клавиши;
4) Информация о факте нажатия или отпускания клавиши помещается в
буфер клавиатуры;
5) Информация о самом раннем факте нажатия или отпускания клавиши
помещается из буфера клавиатуры в порт 60h;
6) Если системный блок разрешил клавиатуре запрашивать прерывание №9,
то контроллер клавиатуры запрашивает разрешение у системного блока
на прерывание №9 (клавиатурное прерывание), иначе переход на шаг 1;
7) Если системный блок не реагирует на запрос клавиатуры, то переход
на шаг 1;
8) Клавиатура перестает анализировать факты нажатий и отпусканий
клавиш. Начинается обслуживание прерывания №9, т.е. начинает
выполняется одна из специальных программ BIOSа, которая выполняет
следующие действия:
8.1) Считывает информацию из порта 60h;
8.2) Сообщает контроллеру клавиатуры о считывании данного с
порта 60h. Этим действием системный блок заставляет контроллер
клавиатуры удалить из буфера клавиатуры информацию, только что
считанную системным блоком из порта 60h, а также разрешает ему
анализировать факты нажатий и отпусканий клавиш.
8.3) Если считанная информация соответствует клавише-переключателю,
то зарегистрировать этот факт в ОЗУ по адресам 417h и 418h.
Если считанная информация соответствует нажатию клавише "Ins(ert)",
то переход на шаг 8.6, иначе переход на шаг 1;
8.4) Если в системном буфере клавиатуры есть свободное место, то
переход на шаг 8.5, иначе издается звуковой сигнал и делается
переход на шаг 1;
8.5) Если нажатой клавише принято ставить в соответствие символ
с ASCII кодом, то поместить в системный буфер клавиатуры порядковый
номер соответствующего символа и скэн-код нажатой клавиши. Переход
на шаг 1;
8.6) Если нажатой клавише принято ставить в соответствие символ с
расширенным ASCII кодом, то поместить в системный буфер клавиатуры
число ноль (это является признаком того, что нажатой клавише
ставится в соответствие символ с расширенный ASCII кодом) и
порядковый номер соответствующего символа;
[3.1] Пояснения.
================
1> Системный блок может запретить клавиатуре реагировать на любые
факты нажатий и отпусканий клавиш на клавиатуре. Для этой цели
системный блок посылает в контроллер клавиатуры специальную команду,
которая запретит электронным схемам клавиатуры реагировать на к-либо
факты нажатия или отпускания клавиш. Другой командой системный блок
может разрешить клавиатуре реагировать на факты нажатий или
отпусканий клавиш. Надо отметить, что системный блок посылает команды
клавиатуре и считывает из нее информацию через специальные порты
ввода/вывода информации, номера которых 60h и 64h.
Если системный блок запретил клавиатуре реагировать на факты
нажатий и отпусканий клавиш, то ввод с клавиатуры невозможен, причем
до тех пор, пока системный блок не разрешит клавиатуре реагировать на
факты нажатий и отпусканий клавиш.
Итак предположим, что системный блок разрешил клавиатуре
реагировать на факты нажатий и отпусканий клавиш, тогда:
2> Контроллер клавиатуры проверяет: есть ли свободное место в его
буфере клавиатуры ?
- - - - - - -
Буфер клавиатуры изображен на рис. 2. Буфер клавиатуры можно
представить как таблицу из 15 ячеек (элементов), каждая ячейка
которого может содержать к-либо число от 0 до 255. Все ячейки
буфера клавиатуры пронумерованы от 1 до 15. Кроме 15 ячеек в
буфере клавиатуры имеются еще 2 специальные ячейки: это так
называемые ячейка "хвоста" и ячейка "головы". Каждая из этих ячеек
содержит к-либо число от 1 до 15, которое соответствует к-либо
ячейки буфера клавиатуры. Например, если в ячейке "головы" находится
число 02, то это число соответствует ячейке №2. Что значит фраза
"соответствует ячейке" ? Это станет ясно чуть позже ...
Предположим, что мы только что включили компьютер. Тогда буфер
клавиатуры будет полностью пустой (а это значит, что в нем есть
свободное место), в его ячейках будут содержаться нули, а в ячейке
"головы" и в ячейке "хвоста" будет находится число 1.
Устройство буфера клавиатуры.
.............................
┌────────────┐ ┌───────────────────┐
│ Ячейка №1 │ │ Ячейка "головы" │
З │ ├────────────┤ │ буфера клавиатуры │
а │ │ Ячейка №2 │<─────────────┐ ├───────────────────┤
п │ ├────────────┤ └─┤ 02 │
о │ . . └───────────────────┘
л │ ├────────────┤
н │ │ Ячейка №7 │<─────┐ ┌───────────────────┐
е │ ├────────────┤ │ │ Ячейка "хвоста" │
н │ . . │ │ буфера клавиатуры │
и √ ├────────────┤ │ ├───────────────────┤
е │ Ячейка №15 │ └─────────┤ 07 │
└────────────┘ └───────────────────┘
Рис. 2
- - - - - - -
3> Если в буфер клавиатуры имеется свободное место, то контроллер
клавиатуры ожидает факта нажатия или отпускания к-либо клавиши
(т.е. ждет пока мы не нажмем на к-нибудь клавишу),а если нет места -
то делается переход на шаг 5.
4> Итак, контроллер клавиатуры дождался, наконец, пока мы нажмем и
отпустим к-либо клавишу.
- - - - - - -
Надо заметить, что клавиатуре совершенно безразлично, что
изображенно на нажатой клавише: буква ли, цифра или что-то другое.
Дело в том, что клавиатура знает только порядковый номер нажатой или
отпущенной клавиши и этот номер называется скэн-кодом клавиши, а что
изображенно на клавише, и что это изображение означает - она
совершенно не знает. Как же тогда, если например Вы нажмете на
клавишу с изображением "*", компьютер (системный блок) узнает, что Вы
ввели именно "*", а не что-то другое? А просто: ведь системный блок
знает,какой символ какому скэн-коду соответствует. Поэтому, системный
блок однозначно (по скэн-коду клавиши) определяет, какой символ Вы
ввели. Таким образом: задачей определения, что же за символ,
собственно, вводился с клавиатуры, занимается не клавиатура, а
системный блок. Клавиатура лишь сообщает системному блоку порядковые
номера (скэн-коды) нажимаемых и отпускаемых клавиш.
- - - - - - -
Так-как мы предположили, что буфер клавиатуры полностью весь
пустой (так-как компьютер только что включили), то контроллер
клавиатуры запишет в его ячейку №1 скэн-код только что нажатой на
клавиатуре клавиши. После этого контроллер клавиатуры запишет в
ячейку "хвоста" число 02. Это означает, что следующая свободная
ячейка буфера клавиатуры имеет номер, равный 2 (т.е. ячейка №2). В
ячейке "головы" все еще остается число 01. Это означает, что ячейка,
которая была заполнена первой, имеет номер, равный 1(т.е. ячейка №1).
Теперь надо учесть тот факт, что только что нажатая клавиша еще
ведь была и отжата! Да, для контроллера клавиатуры этот факт
знаменателен, и поэтому следующим делом, которое он сделает, будет
помещение в следующую свободную ячейку, номер которой хранится в
ячейке "хвоста", числа, которое на 128 больше скэн-кода нажатой
клавиши. После этого он запишет в ячейку "хвоста" число 03. Это
означает, что следующая свободная ячейка буфера клавиатуры уже имеет
номер, равный 3 (т.е. ячейка №3).В ячейке "головы" все еще остается
число 01. Это означает, что ячейка, которая была заполнена первой,
имеет номер, равный 1 (т.е. ячейка №1). Таким образом, если в ячейке
буфера клавиатуры находится число большее 128, то это говорит о том,
что какая-то клавиша была отжата, а если в ячейке буфера клавиатуры
находится число меньшее либо равное 128, то это говорит о том, что
какая-то клавиша была в нажатом состоянии. Таким образом, контроллер
клавиатуры учитывает все факты и нажатия и отпускания клавиш.
- - - - - - -
А что будет, если мы нажмем к-либо клавишу и будем ее удерживать ?
В этом случае контроллер клавиатуры будет записывать в свой буфер
клавиатуры скэн-коды нажатой клавиши до тех пор, пока нажатая клавиша
не будет отжата. Это явление называется "автоповтор". Как только
нажатая клавиша будет отжата контроллер клавиатуры запишет в
следующую свободную ячейку (на которую указывает ячейка "хвоста")
скэн-код отжатой клавиши + 128. Таким образом, если в ячейках буфера
клавиатуры в подряд записан один и тот же скэн-код клавиши, то это
говорит о том, что к-либо клавиша была нажата долгое время.
А что будет, если мы нажмем к-либо клавишу и не отпуская ее нажмем
на к-либо другую клавишу, после чего отпустим вторую нажатую клавишу
а вслед за ней и первую ? В этом случае будет следующее:
- в буфер клавиатуры будет записываться скэн-код первой нажатой
клавиши до тех пор, пока не нажмется вторая клавиша;
- как только нажмется вторая клавиша в буфер клавиатуры сразу начнет
записываться скэн-код второй нажатой клавиши, до тех пор, пока не
она не отожмется;
- как только отожмется вторая нажатая клавиша в буфер клавиатуры
сразу запишется скэн-код второй клавиши + 128, после чего в буфер
клавиатуры ничего не будет записываться до тех пор, пока не
отожмется первая нажатая клавиша;
- как только отожмется первая нажатая клавиша в буфер клавиатуры
сразу запишется ее скэн-код + 128;
Кроме того, есть некоторые комбинации из нажатых вместе клавиш,
которые имеют свой индивидуальный скэн-код, который занимает (!!)
несколько ячеек в буфере клавиатуры, т.е. такое совместное нажатие
нескольких клавиш как бы эквивалентно нажатию какой-то "невидимой"
всем нам клавиши с длинющим скэн-кодом. При отжатии такой комбинации
клавиш в буфер клавиатуры заносится ни скэн-код + 128, а нечто
другое, причем оно тоже занимает несколько ячеек буфера клавиатуры.
Мы не будем рассматривать подобные комбинации ("сверх" клавиши), т.к.
они не представляющие для нас особого интереса ...
Теперь рассмотрим ситуацию, когда в буфере клавиатуры заполненно
14 ячеек, скажем с ячейки №1 по ячейку №14 (ячейка №15 еще свободна):
┌────────────┐ ┌───────────────────┐
│ Ячейка №1 │<─────────────┐ │ Ячейка "головы" │
├────────────┤ │ │ буфера клавиатуры │
│ Ячейка №2 │ │ ├───────────────────┤
├────────────┤ └─┤ 01 │
. . └───────────────────┘
├────────────┤
│ Ячейка №14 │ ┌───────────────────┐
├────────────┤ │ Ячейка "хвоста" │
│ Ячейка №15 │<─────────────┐ │ буфера клавиатуры │
└────────────┘ │ ├───────────────────┤
└─┤ 15 │
└───────────────────┘
В этом случае контроллер клавиатуры определит, что в его буфере
осталась всего лишь одна свободная ячейка (№15) и он запишет в нее
число 0, причем ничего другого в нее записать будет уже нельзя (!!).
Таким образом, данные о фактах нажатий и отжатий клавиш размещаются
не во всех 15 ячейках буфера клавиатуры, а в каких-либо 14 ячейках,
причем в последней из свободных ячеек (15-ой) всегда будет записан 0
(это дело рук контроллера клавиатуры). Зачем же надо было контроллеру
клавиатуры записывать в последнюю из свободных ячеек число 0 ? Прежде
чем ответить на этот вопрос рассмотрим следующую ситуацию:
┌────────────┐ ┌───────────────────┐
│ Ячейка №1 │<─────┐ │ Ячейка "головы" │
├────────────┤ │ │ буфера клавиатуры │
. . │ ├───────────────────┤
├────────────┤ │ ┌─┤ 11 │
│ Ячейка №11 │<─────│───────┘ └───────────────────┘
├────────────┤ │
│ Ячейка №12 │ │ ┌───────────────────┐
├────────────┤ │ │ Ячейка "хвоста" │
. . │ │ буфера клавиатуры │
├────────────┤ │ ├───────────────────┤
│ Ячейка №15 │ └─────────┤ 01 │
└────────────┘ └───────────────────┘
Смысл данной ситуации таков: в то время, когда буфер клавиатуры был
полностью весь пустой, по каким-то причинам ячейка "головы" и ячейка
"хвоста" указывали не на 1 ячейку, а на 11 ячейку буфера клавиатуры.
После этого были заполнены 5 ячеек (т.е. ячейки с 11 по 15). Что же
будет делать контроллер клавиатуры, когда ему будет нужно записать
к-либо информацию в буфер клавиатуры, ведь хоть в нем и заполнилась
последняя 15 ячейка, но ведь имеется еще 9 свободных ячеек (т.е.
ячейки с 1 по 10) ? Итак: после того, как заполнится 14 ячейка,
контроллер клавиатуры запишет в ячейку "хвоста" число 15; после того,
как заполнится 15 ячейка он запишет в ячейку "хвоста" число 1, и уже
после этого он сможет заполнить ячейку №1 (после ее заполнения в
ячейку "хвоста" он запишет число 2), и т.д. до тех пор, пока он не
заполнит ячейку №9. После заполнения ячейки №9 значение ячейки
"хвоста" будет равно 10,а значение ячейки "головы" останется прежним,
т.е. равным 11.Теперь контроллер клавиатуры сделает вывод: раз ячейки
"головы" и "хвоста" отличаются на 1, то можно считать, что свободного
места в буфере клавиатуры уже нет, и поэтому он запишет в последнюю
свободную ячейку (т.е. ячейку №10) число 0.
Теперь пункт 3 (ожидание факта нажатия или отпускания клавиши)
выполняться не будет, т.к. уже некуда поместить информацию о к-либо
факте нажатия или отпускания клавиши.
Теперь подошло время ответить на вопрос: зачем же надо было
контроллеру клавиатуры записывать в последнюю из свободных ячеек
число 0 ? Предположим что после заполнения 9 ячейки контроллер
клавиатуры записал в ячейку "хвоста" число 10, после этого он
заполнил данными ячейку №10 и записал в ячейку "хвоста" число 11.
И что бы получилось ? А то, что значения ячеек "хвоста" и "головы"
содержали бы число 11, как и в случае полностью пустого буфера
клавиатуры. А как бы мы (да и компьютер) теперь узнали: буфер
клавиатуры весь пуст и забит разными числами ("мусором"), или он
весь полон и содержит информацию о фактах нажатий и отжатий клавиш ?
К сожалению мы этого никак бы не определили! Именно поэтому и сделали
буфер клавиатуры таким хитрым:
- если значения ячеек "хвоста" и "головы" равны, то это означает, что
буфер весь пуст;
- если значение ячейки "головы" больше значения ячейки "хвоста" на 1,
причем ячейка "хвоста" будет указывать на ячейку с записанным в нее
нулем, то это означает, что буфер весь полон;
Таким образом, контроллер клавиатуры записывает в последнюю из
свободных ячеек число 0 лишь для того, чтобы в ней что-нибудь было,
т.к. в эту ячейку все ровно нельзя ничего записать (этого требует
хитрость устройства буфера клавиатуры).
- - - - - - -
5> После того, как контроллер клавиатуры записал в свободную ячейку
(на которую указывала ячейка "хвоста") буфера клавиатуры скэн-код
нажатой клавиши или скэн-код + 128 (если клавиша была отжата), то
он делает следующее: он ищет в буфере клавиатуры ту ячейку, в
которую он записал информацию раньше всего (этим самым он
вспоминает о самом раннем факте нажатия или отпускания клавиши,
который он запомнил). А это как раз та ячейка, на которую указывает
ячейка "головы" (т.е. в ячейке "головы" хранится номер ячейки с
информацией о самом раннем факте нажатия или отпускания клавиши).
После того, как нужная ячейка будет найдена, ее значение (т.е. то,
что в ней хранится) помещается в порт №60h. Помещение содержимого
этой ячейки в порт №60h можно представить так: содержимое ячейки
помещается в чудесную "шкатулку" с надписью "порт 60h", из которой,
после, системный блок будет "доставать" ее содержимое, т.е. данные,
которые желает ему сообщить клавиатура.
- - - - - - -
После того, как системный блок "достанет" данное клавиатуры из
порта 60h, он даст знать об этом контроллеру клавиатуры, который
узнав об этом обрадуется (т.к. его данное успешно считано системным
блоком) и изменит значение ячейки "головы", а именно: если в
ячейке "головы" было число 1, то будет 2, если было 3, то будет 4
(этим самым контроллер клавиатуры удаляет из своего буфера клавиатуры
то данное, которое только что считал системный блок). Таким образом,
значение ячейки "головы" снова будет указывать на ту ячейку буфера
клавиатуры, в которой хранится наистарейшая, еще не считанная
системным блоком информация о факте нажатия или отпускания клавиши.
Если после этого:
- значения ячеек "хвоста" и "головы" равны, то это означает, что
буфер весь пуст;
- значение ячейки "головы" больше значения ячейки "хвоста" на 1,
причем ячейка "хвоста" будет указывать на ячейку с записанным в нее
нулем, то это означает, что буфер весь полон;
- - - - - - -
Итак, данные из ячейки с информацией о самом раннем факте нажатия
или отпускания клавиши помещены в порт №60h.
6> Если системный блок разрешил клавиатуре запрашивать прерывание №9,
то контроллер клавиатуры запрашивает разрешение у системного блока
на прерывание №9 (посылает по кабелю в системный блок специальный
сигнал, который просит его выполнить прерывание №9), иначе переход
на шаг 1;
- - - - - - -
Системный блок может запретить клавиатуре запрашивать прерывание №9.
Для этой цели системный блок посылает в контроллер клавиатуры
специальную команду, которая запретит контроллеру клавиатуры
запрашивать прерывание №9. Другой командой системный блок может
разрешить контроллеру клавиатуры запрашивать прерывание №9.
- - - - - - -
Что же такое "прерывание №9" ? Прерывание №9 - это процесс,
состоящий из трех основных этапов:
1) Системный блок запоминает свое текущее состояние (чтобы после в
него вернуться) и прекращает свою текущую работу;
2) Начинает выполняться одна из специальных программ BIOSа, которая
называется "обработчик прерывания №9". Эта программа считывает данное
клавиатуры через порт 60h и решает (на основании полученного от
клавиатуры скэн-кода или скэн-кода + 128), что же за символ был
введен с клавиатуры, после чего записывает в системный буфер
клавиатуры соответствующие данные;
3) После того, как обработчик прерывания №9 закончит свою работу,
системный блок восстановит свое предыдущее состояние (которое было
предварительно запомнено), и начинает продолжать свою предыдущую
работу с того места, где прежде он остановился;
- - - - - - -
Итак предположим, что системный блок разрешил клавиатуре
запрашивать прерывание №9.
7> Если системный блок по каким-то причинам занят и не может уделить
клавиатуре время на выполнение прерывания №9, то переход на шаг 1.
8> Системный блок получил сигнал из клавиатуры, просящий его
выполнить прерывание №9. Он запоминает свое текущее состояние, чтобы
после в него вернуться, и перестает реагировать на клавиатуру (т.е.
на ее просьбы выполнить прерывание №9).
После того, как системный блок закончит выполнять прерывание №9
и будет хотеть перейти на шаг №1, системный блок снова начнет
реагировать на клавиатуру и ее просьбы выполнить прерывание №9,
восстановит свое предыдущее состояние (он ранее его запомнил) и
начнет продолжать то дело, которым он занимался до выполнения
прерывания.
Теперь компьютер запустит специальную программу BIOSа - обработчик
прерывания №9 (эта программа постоянно хранится в памяти системного
блока), которая будет выполнять прерывание №9.
Таким образом, когда клавиатура узнает о каком-либо факте ввода
с клавиатуры, у нее сразу появляется желание сообщить об этом
системному блоку, чтобы он с помощью своей программы (обрабатывающей
прерывание №9) разобрался: что же такое введенно с клавиатуры и что
это значит: символ, буква и т.д.. Дело в том, что клавиатура никаких
символов не знает (она вообще кроме порядковых номеров клавиш мало
что знает). Поэтому системный блок взвалил на себя такую обязанность:
принимать от клавиатуры скэн-код нажатой клавиши или скэн-код+128 -
если клавиша отжалась и понимать: что же за символ был введен с
клавиатуры, прописной он должен иметь вид или строчный и т.д.
- - - - - - -
Интересно, а как же системный системный блок узнает, какой вид
должен иметь введенный символ, прописной или строчный ? Все просто:
если, к примеру, мы нажмем впервые на клавишу "CapsLock" (она
устанавливает и выключает режим ввода букв в прописном виде), то
системный блок запомнит этот факт (сразу после того, как примет от
клавиатуры скэн-код клавиши "CapsLock") и после получения от
клавиатуры к-либо скэн-кода символьной клавиши будет считать, что
символ, соответствующий этой клавиши, имеет прописной вид. Если
же после системный блок снова получит от клавиатуры скэн-код,
соответствующий клавиши "CapsLock", то он запомнит этот факт и после
получения от клавиатуры к-либо скэн-кода символьной клавиши будет
считать, что символ, соответствующий этой клавиши, имеет строчный
вид.
- - - - - - -
Итак, программа BIOSа, которая служит для выполнения прерывания №9,
начинает свою работу, а именно:
8.1> Считывает данное клавиатуры из порта 60h и запоминает его
(где она запоминает это данное нам не важно);
8.2> Сообщает контроллеру клавиатуры о считывании данного с
порта 60h. Этим действием системный блок заставляет контроллер
клавиатуры удалить из буфера клавиатуры информацию, только что
считанную системным блоком из порта 60h, а также разрешает ему
анализировать факты нажатий и отпусканий клавиш. А как удаляется
информация из буфера клавиатуры ? А очень просто: значение ячейки
"головы" увеличивается на 1, и это означает, что свободных ячеек
в буфере клавиатуры стало больше на 1. Таким образом:
- ячейка "хвоста" буфера клавиатуры изменяется при записи данного
в его свободную ячейку, и это означает, что свободного места в
буфере клавиатуры стало меньше (на 1 ячейку);
- ячейка "головы" буфера клавиатуры изменяется при считывании
системным блоком данного с его заполненной ячейки, и это
означает, что свободного места в буфере клавиатуры стало больше
(на 1 ячейку);
8.3> Если считанное данное из порта №60h соответствует нажатию или
отжатию к-либо клавиши-переключателю, то в ОЗУ по адресам 417h и
418h зарегистрируется этот факт (в этих ячейках памяти
регистрируются факты нажатия и отжатия клавиш-переключателей),
причем если считанное данное больше 128 (это означает, что к-либо
клавиша-переключатель была отжата), то зарегистрировать факт
отжатия, а если считанное данное меньше или равно 128, то
зарегистрировать факт нажатия.
- - - - - - -
Надо отметить, что системный блок придает значение факту отжатия
к-либо клавиши только тогда, когда отжатой была к-либо клавиша
-переключатель. Если же системный блок получает от клавиатуры
данное, соответствующее отжатию к-либо другой клавиши (не клавиши
-переключателя), то он остается равнодушен к такому факту, и
делает переход на пункт 1. И действительно, чего же удивительного в
том, что после нажатия на клавишу, например с изображенным на ней
символом "!", эту клавишу отжали ? Ничего, так-как отжатие этой
клавиши ничего не означает: ни ввода нового символа "!", ни чего-то
другого. Тогда почему же для клавиш-переключателей учитываются факты
и нажатий и отжатий ? Дело в следующем: предположим что Вы, например,
нажали на клавишу "Shift" и не отпуская ее нажимаете на клавиши с
изображением букв. При нажатии на клавишу "Shift" клавиатура сообщит
системному блоку скэн-код клавиши "Shift", после чего системный блок
поймет, что все буквы, которые будут вводиться с клавиатуры, будут
иметь прописной вид. Таким образом, пока Вы не отожмете клавишу
"Shift" все вводимые с клавиатуры буквы будут иметь прописной вид.
Как только Вы отожмете клавишу "Shift", клавиатура сообщит системному
блоку скэн-код клавиши "Shift" + 128 (что означает отжатие клавиши
"Shift"), после чего системный блок поймет, что все буквы, которые
будут вводиться с клавиатуры, будут иметь строчный вид. Таким
образом, если бы системный блок не реагировал на скэн-коды клавиш
-переключателей + 128 (т.е. на факты отжатий клавиш-переключателей),
то все вводимые буквы (даже после отжатия клавиши "Shift") имели бы
прописной вид! Именно поэтому системный блок учитывает факты и
нажатий и отжатий клавиш-переключателей.
- - - - - - -
8.4> Системный блок проверяет: есть ли свободное место в его
системном буфере клавиатуры ? Если есть, то делается переход на
шаг 8.5, иначе издается звуковой сигнал и делается переход на
шаг 1;
- - - - - - -
Системный буфер клавиатуры (СБК) имеет точно такое же устройство,
как и буфер клавиатуры (если не считать небольшие отличия). Прежде
рассматривать системный буфер клавиатуры интересно выяснить: а зачем,
собственно, он вообще нужен компьютеру ?
Итак мы знаем, что в клавиатуре есть буфер клавиатуры, в котором
временно (пока не считает системный блок) хранится информация о тех
фактах нажатия и отпускания клавиш, которые еще не успели приняться
системным блоком. Если бы в клавиатуре не было буфера клавиатуры, то
вся информация о фактах нажатия и отпускания клавиш, которые бы
происходили в то время, когда системный блок не мог (т.к. был занят
более важным делом) выполнить просьбы клавиатуры о выполнении
прерывания №9, были бы безвозвратно утеряны. А так-как клавиатура
имеет буфер клавиатуры, то вся эта информация сохраняется и когда
системный блок начинает мочь выполнять прерывание №9, то вся она
благополучно им обработается.
В системном блоке есть подобие буфера клавиатуры - это системный
буфер клавиатуры (СБК), в котором временно (пока их не считает наша
или к-либо другая компьютерная программа) хранятся те данные, которые
были введены с клавиатуры: буквы, цифры, различные знаки ("*/-+!") и
т.д. Если бы в системном блоке не было СБК, то системный блок мог бы
запомнить лишь ту поступившую в него информацию от клавиатуры,
которая бы поступила последней (это потому, что последние поступившая
информация записалась бы на тоже самое место, где бы хранилась еще не
считанная нашей программой ранее туда записанная информация). А это
значило бы, что вся информация, которая поступила в системный блок
перед последнее поступившей информацией, безвозвратно утеряна.
Поэтому в системном блоке и устроили СБК, чтобы он сохранял
поступившую с клавиатуры информацию до тех пор, пока она не
понадобится работающей (например нашей) компьютерной программе.
Системный буфер клавиатуры изображен на рис. 3. Системный буфер
клавиатуры можно представить как таблицу из 16 ячеек (элементов),
каждая из которых состоит из 2 байтов (частей). Каждый байт ячейки
СБК может содержать к-либо число от 0 до 255. Все байты ячеек СБК
пронумерованы от 30 до 61. Кроме 32 байтов в буфере клавиатуры
имеются 2 специальные ячейки: это так называемые ячейка "хвоста" и
ячейка "головы". Каждая из этих ячеек содержит к-либо число от 30
до 60, которое соответствует началу к-либо ячейки буфера клавиатуры.
Например, если в ячейке "головы" находится число 32, то это число
соответствует байту №32 (началу ячейки №2).
Устройство системного буфера клавиатуры.
........................................
┌───────┬───────┐ ┌───────────────────┐
│30 байт│31 байт│ Ячейка №1 │ Байт "головы" СБК │
З │ ├───────┼───────┤ │ │
а │ │32 байт│33 байт│ Ячейка №2 ├───────────────────┤
п │ ├──┬────┴───────┤ ┌─┤ 32 │
о │ . └───────────────────────────┘ └───────────────────┘
л │ ├───────┬───────┤
н │ │42 байт│43 байт│ Ячейка №7 ┌───────────────────┐
е │ ├──┬────┴───────┤ │ Байт "хвоста" СБК │
н │ . └───────────────┐ │ │
и √ ├───────┬───────┤ │ ├───────────────────┤
е │60 байт│61 байт│ │ Ячейка №16 ┌┤ 42 │
└───────┴───────┘ └────────────┘└───────────────────┘
Рис. 3
С помощью системного буфера клавиатуры наши программы узнают о
том, какие буквы, знаки и т.д. были введены с клавиатуры.
С помощью наших программ мы можем узнать содержимое системного
буфера клавиатуры, а также значения ячеек "головы" и "хвоста".
Например, если значения ячеек "хвоста" и "головы" будут равны, то
это будет означать, что СБК весь пуст (никакие данные с клавиатуры
не поступали), а если значение ячейки "хвоста" не будет равно
значению ячейки "головы", то это будет означать, что в СБК есть
для нас какая-то информация. Кроме этого, у нас есть возможность
произвольно изменять содержимое системного буфера клавиатуры и
значения его ячеек "головы" и "хвоста". Такое изменение ячеек
"головы" и "хвоста"будет создавать иллюзию либо нажатия к-либо
клавиши на клавиатуре (хотя ее никто и не нажимал), либо наоборот
- как будто ничего не нажималось (хотя фактически данные с
клавиатуры вводились). Как это сделать будет рассмотренно в [6].
- - - - - - -
8.5> Если нажатой клавише принято ставить в соответствие символ,
порядковый номер которого должен называться ASCII кодом, то
системный блок поместит в свободную ячейку СБК (ее номер системный
блок усмотрит в ячейке "хвоста") следующее:
- в первый байт ячейки: порядковый номер (который теперь называется
ASCII кодом) символа, соответствующего клавише;
- во второй байт: скэн-код (порядковый номер) той клавиши, которую
нажимали и которой был поставлен в соответствие символ;
После этого делается переход на шаг 1;
8.6> Если нажатой клавише принято ставить в соответствие символ,
порядковый номер которого должен называться расширенным ASCII
кодом, то системный блок поместит в свободную ячейку СБК (ее номер
системный блок усмотрит в ячейке "хвоста") следующее:
- в первый байт ячейки: число 0 (число 0 как-раз и указывает на
то, что в данной ячейке СБК находится порядковый номер символа,
который теперь называется не ASCII кодом, а расширенным ASCII
кодом);
- во второй байт: порядковый номер (который теперь называется
расширенным ASCII кодом) символа, соответствующего клавише;
- - - - - - -
Нужно отметить, что системный блок умеет различать не только факты
нажатия и отжатия отдельной клавиши, но и факты нажатия и отжатия
некоторых определенных комбинаций клавиш. Эти комбинации получаются
при совместном нажатии одной или нескольких клавиш-переключателей и
к-либо другой клавиши. Подобную комбинацию можно получить, например,
если нажать на клавишу "Alt" и не отпуская ее нажать на клавишу "F1".
Такое совместное нажатие клавиш системный блок воспринимает как
нажатие на к-либо одну "новую" клавишу. В таблице [5.1] приведены все
возможные комбинации клавиш, которые системный блок принимает за одну
"виртуальную" клавишу.
Как же системный блок распознает комбинации из нажатых клавиш ?
Рассмотрим, например, как системный блок распознает следующую
комбинацию из трех нажатых клавиш: "Ctrl", "Alt", "F1", т.е. сперва
нажимают на клавишу "Ctrl" и не отпуская ее нажимают на клавишу
"Alt" и клавишу "F1". Итак:
1) При нажатии на клавишу "Ctrl" клавиатура передает системному
блоку скэн-код клавиши "Ctrl". Системный блок поняв, что на
клавиатуре нажали на клавишу-переключатель "Ctrl", сразу
зафиксирует этот факт в ОЗУ по адресам 417h и 418h;
2) Теперь (не отжимая клавишу "Ctrl") на клавиатуре нажимают на
клавишу "Alt". Теперь клавиатура передает системному блоку скэн-код
клавиши "Alt". Системный блок поняв, что на клавиатуре нажали на
клавишу-переключатель "Alt", сразу зафиксирует этот факт в ОЗУ по
адресам 417h и 418h;
3) Теперь (не отжимая клавишу "Ctrl" и клавишу "Alt") на клавиатуре
нажимают на клавишу "F1". Теперь клавиатура передает системному
блоку скэн-код клавиши "F1". Системный блок поняв, что на
клавиатуре нажали на клавишу "F1", сразу смотрит: в ОЗУ по адресам
417h и 418h зафиксирован ли какой-нибудь факт того, что к-либо
клавиша-переключатель находится в нажатом состоянии (если клавиша
находится в нажатом состоянии, то системный блок получал от
клавиатуры только ее скэн-код (при ее нажатии), а скэн-код + 128
(при ее отжатии) он не получал). Если никаких фактов нажатий на
клавиши-переключатели не зафиксированно, то системный блок (как
обычно) записывает в системный буфер клавиатуры соответствующие
клавише "F1" данные. А если к-либо факты нажатия на клавиши
-переключатели зафиксированы (в ОЗУ адресам 417h и 418h), то
системный блок записывает в системный буфер клавиатуры данные,
соответствующие не клавише "F1", а комбинации из нажатых клавиш-
переключателей (в нашем примере это клавиша "Ctrl" и клавиша "Alt")
и к-либо клавиши (в нашем примере это клавиша "F1");
4) При отжатии клавиши "F1" клавиатура передаст системному блоку
скэн-код клавиши "F1" + 128. Системный блок поймет, что на
клавиатуре отжали клавишу "F1", и он проигнорирует этот факт, т.к.
этот факт ему ни о чем интересном не говорит;
5) При отжатии клавиши "Alt" клавиатура передаст системному блоку
скэн-код клавиши "Alt" + 128. Системный блок поймет, что на
клавиатуре отжали клавишу "Alt", и он сразу же зафиксирует этот
факт (т.е. факт отжатия клавиши "Alt") в ОЗУ по адресам 417h и 418h
(этот факт для него достаточно важен);
6) При отжатии клавиши "Ctrl" клавиатура передаст системному блоку
скэн-код клавиши "Ctrl"" + 128. Системный блок поймет, что на
клавиатуре отжали клавишу "Ctrl"", и он сразу же зафиксирует этот
факт (т.е. факт отжатия клавиши "Ctrl"") в ОЗУ по адресам 417h и
418h (этот факт для него достаточно важен);
Если теперь мы снова нажмем на клавишу "F1", то системный блок,
получив от клавиатуры скэн-код клавиши "F1" и увидев, что в ОЗУ по
адресам 417h и 418h нет информации о нажатии к-либо клавиши
-переключателя, запишет в системный буфер клавиатуры (как и обычно)
данные, соответствующие клавише "F1";
- - - - - - -
9> Переход на шаг 1.
* * * * * * *
[4] ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ.
******************************
[4.1] Автоповтор.
=================
При вводе информации с клавиатуры часто бывает необходимо нажимать
несколько раз в подряд одну и ту же клавишу. Например: нам необходимо
ввести с клавиатуры такую строку "************". Для этого мы должны
нажать и отпустить клавишу с изображением "*" 12 раз. Для того, чтобы
это было не так утомительно и более быстро придумали следующее: если
мы нажимаем на к-либо клавишу и удерживаем ее в нажатом состоянии
больше чем обычно, то контроллер клавиатуры понимает, что мы хотим
ввести несколько одинаковых данных, например символов "*", и поэтому
он начинает за нас "отпускать и нажимать" нажатую клавишу, до тех
пор, пока мы ее не отпустим.
Рассмотрим механизм автоповтора.
Нажмем, например, на клавишу с изображением "*" и будем удерживать ее
в нажатом состоянии больше чем обычно. При этом произойдет следующее:
при обнаружении факта нажатия на клавишу '*' контроллер клавиатуры
запишет в свободную ячейку буфера клавиатуры скэн-код нажатой
клавиши, равный 9. После этого контроллер клавиатуры обнаружит, что
клавиша нажата больше чем обычно, и поэтому в следующую ячейку буфера
клавиатуры он снова запишет код нажатой клавиши, т.е. число 9. До тех
пор, пока мы не отпустим нажатую клавишу контроллер клавиатуры будет
записывать в следующие ячейки скэн-код, равный 9. Как только мы
отпустим нажатую клавишу контроллер клавиатуры запишет в следующую
ячейку число 9+128, означающий что нажатая клавиша была отпущена.
Таким образом, анализируя информацию, посылаемую клавиатурой,
системный блок узнает, какие клавиши действительно нажимались и
отпускались много раз, а какие были нажаты, удержаны больше чем
обычно, а после отпущены. Надо отметить, что системному блоку нет
разницы, как вводятся данные, путем нажатия и отпускания, либо путем
нажатия, удерживания и отпускания. В обоих случаях в СБК появятся
одинаковые данные.
* * * * * * *
[4.2] Прямой ввод символов
в системный буфер клавиатуры.
=============================
Иногда бывает необходимо ввести с клавиатуры к-либо символ, который
не изображен ни на одной клавиши, например такой '┼'. Как же ввести
с клавиатуры такой символ ? Для этого случая программа BIOSа,
выполняющая прерывание №9, предоставляет нам метод прямого ввода
символов. Что это за метод ? Суть этого метода состоит в том, что
если нам нужно ввести к-либо символ, то можно нажать на клавишу 'Alt'
и удерживая ее нажатой набрать на дополнительной клавиатуре
десятичный ASCII код (порядковый номер) нужного символа, после чего
отжать клавишу 'Alt'. После отжатия клавиши 'Alt' набранный символ
поместится в системный буфер клавиатуры.
* * * * * * *
[4.3] Индикаторы клавиатуры.
============================
В клавиатуре имеются 3 миниатюрных индикатора, которые отображают
некоторые режимы работы клавиатуры. Это:
Индикатор: Назначение:
--------- -----------
CapsLock Если светится, то включен режим ввода букв в
прописном виде, а если не светится, то включен
режим ввода букв в строчном виде.
NumLock Если светится, то включен режим использования
клавиш дополнительной клавиатуры для ввода цифр,
а если не светится, то включен режим использования
клавиш дополнительной клавиатуры для перемещения
текста и курсора по экрану.
ScrollLock Если светится, то включен такой режим работы
клавиатуры, при котором нажатия на стрелки будут
вызывать перемещение не курсора по экрану, а
изображения (текста,рисунка) на нем.
Контроллер клавиатуры включает и выключает свои индикаторы лишь по
командам системного блока. Мы имеем произвольно включать и выключать
индикаторы клавиатуры. Для этого нам необходимо написать программу,
которая бы отдала соответствующее приказание �