Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)
Demon's Souls |#9| Heart of surprises

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Роберт Журден Весь текст 1069.56 Kb

Справочник программиста на IBM PC

Предыдущая страница Следующая страница
1 ... 16 17 18 19 20 21 22  23 24 25 26 27 28 29 ... 92
   IN   AL,60H         ;получаем скан-код из порта A
   MOV  AH,AL          ;помещаем копию в AH
   PUSH AX             ;сохраняем скан-код
   IN   AL,61H         ;читаем состояние порта B
   OR   AL,10000000B   ;устанавливаем бит 7
   OUT  61H,AL         ;посылаем измененный байт в порт
   AND  AL,01111111B   ;сбрасываем бит 7
   OUT  61H,AL         ;возвращаем состояние порта B
;---ES должен указывать на область данных BIOS
   MOV  AX,40H         ;устанавливаем сегмент
   MOV  ES,AX          ;
   POP  AX             ;возвращаем скан-код из стека
;---проверка клавиши сдвига
         CMP  AL,42          ;нажат левый сдвиг?
         JNE  KEY_UP         ;нет - смотрим следующее
         MOV  BL,1           ;да - изменяем бит статуса
         OR   ES:[17H],BL    ;меняем прямо регистр статуса
         JMP  QUIT           ;выход из процедуры
KEY_UP:  CMP  AL,170         ;левый сдвиг отпущен?
         JNE  NEXTKEY        ;нет - смотрим следующее
         MOV  BL,11111110B   ;да - меняем бит статуса
         AND  ES:[17H],BL    ;меняем прямо регистр статуса
         JMP  QUIT           ;выход из процедуры
NEXTKEY:                     ;просмотр других переключателей
;---это символьная клавиша - интерпретируем скан-код
             TEST AL,10000000B  ;код освобождения клавиши?
             JNZ  QUIT          ;да - выходим из процедуры
             MOV  BL,ES:[17H]   ;иначе берем байт статуса
             TEST BL,00000011B  ;клавиша сдвига нажата?
             JZ   CONVERT_CODE  ;нет - уходим дальше
             ADD  AL,100        ;да - значит заглавная буква
CONVERT_CODE:  MOV  BX,OFFSET TABLE  ;готовим таблицу
             XLAT TABLE         ;преобразуем скан-код в ASCII
             CMP  AL,0          ;возвращен 0?
             JE   QUIT          ;если да, то на выход
;---код клавиши готов, проверяем не полон ли буфер клавиатуры
             MOV  BX,1AH        ;смещение указателя на голову
             MOV  CX,ES:[BX]    ;получаем его значение
             MOV  DI,ES:[BX]+2  ;получаем указатель хвоста
             CMP  CX,60         ;голова на вершине буфера?
             JE   HIGH_END      ;да - переходим к спец. случаю
             INC  CX            ;увеличиваем указатель головы
             INC  CX            ;на 2
             CMP  CX,DI         ;сравниваем с указателем хвоста
             JE   QUIT          ;если равны, то буфер полон
             JMP  GO_AHEAD      ;иначе вставляем символ
HIGH_END:    CMP  DI,30         ;проверка спец. случая
             JE   QUIT          ;если буфер полон, то выход
;---буфер не полон - вставляем в него символ
GO_AHEAD:    MOV  ES:[DI],AL    ;помещаем символ в позицию хвоста
             CMP  DI,60         ;хвост в конце буфера?
             JNE  NO_WRAP       ;если нет, то добавляем 2
             MOV  DI,28         ;иначе указатель хвоста = 28+2
NO_WRAP:     ADD  DI,2          ;получаем новое значение хвоста
             MOV  ES:[BX]+2,DI  ;посылаем его в область данных
;---завершение прерывания
QUIT:        POP  ES            ;восстанавливаем изменяемые
             POP  DI            ;регистры
             POP  CX            ;
             POP  BX            ;
             POP  AX            ;
             MOV  AL,20H        ;выдаем сигнал об окончании
             OUT  20H,AL        ;аппаратного прерывания
             IRET               ;возврат из прерывания
NEW_KEYBOARD ENDP
               Раздел 2. Доступ к отдельным клавишам.

   Процедура  обработки  нажатия клавиши должна  проверять  массу
различных типов  клавиш  и  условий,  поскольку  как одно-, так и
двухбайтные коды могут появляться в комбинации с клавишами-перек-
лючателями. Hе все клавиши логически сгруппированы, по типу кода,
который им соответствует.  Hапример, клавиша   генери-
рует однобайтный код  ASCII,  а  клавиша    - двухбайтный
расширенный код.  Kлавиша Ctlr генерирует однобайтный код,  когда
она используется в сочетании с  алфавитными клавишами и двухбайт-
ный код в остальных случаях.  Эти нерегулярности вознмкают  из-за
ограниченности набора ASCII: прерывание клавиатуры следует согла-
шениям ASCII, когда возможно, но когда это невозможно выдает свои
(расширенные) коды.
   В данном разделе перечислены  различные группы клавиш, даны их
коды и указаны встречающиеся аномалии.  В большинстве случаев эта
информация доступна в менее удобном  виде из таблиц кодов ASCII и
расширенных  кодов,  приведенных в разделе 3 этой  главы.   Здесь
обсуждаются также специальные  свойства,  приписываемые отдельным
клавишам Бейсиком, а также специальная обработка, для интерпрета-
ции отдельных клавиш (таких как забой), применяемая в прерываниях
DOS.
   3.2.1 Использование клавиш  ,  ,   и
.

   Kлавиши , ,   и  - единственные
четыре  несимвольные клавиши, которые генерируют однобайтные  ко-
ды ASCII. Эти коды содержатся в наборе управляющих кодов [7.1.9],
которые  занимают первые 32 кода в наборе ASCII.  Эти четыре кода
могут быть получены также комбинацией буквенных клавиш с клавишей
Ctrl:

   ASCII   8    BackSpace          Ctrl + H
   ASCII   9    Tab                Ctrl + I
   ASCII  13    Enter              Ctrl + M
   ASCII  27    Escape             Ctrl + [

В [3.2.2] показано как различать нажатие одной клавиши и комбина-
цию с клавишей Ctrl.  Отметим, что обратная табуляция, производи-
мая  нажатием комбинации  + , выдает расширенный  код
0;15.
   Hекоторые из прерываний обработки ввода с клавиатуры автомати-
чески интерпретируют эти четыре специальных кода. В Бейсике функ-
ция INPUT реагирует  на  ,    и .  Функция
INKEY$  не интерпретирует ни один из управляющих кодов, поскольку
у нее нет автоматического эха на экран.  Всю работу должна выпол-
нять Ваша программа.  Hапомним, что для управления движением кур-
сора Бейсик предоставляет функцию TAB.  Из прерываний BIOS и DOS,
те  которые выдают эхо на терминал интерпретируют  также  клавиши
 и .  После  того  как  эти коды интерпретируются
соответствующим  образом, коды ASCII все равно  появляются в  AL,
после чего они могут быть  включены в строку символов или игнори-
рованы, в зависимости от того, что требуется.
   3.2.2  Использование клавиш-переключателей: ,   и
.

   Три типа клавиш-переключателей заставляют только другие клави-
ши  клавиатуры генерировать различные коды.  Kак  правило,  такие
комбинации генерируют  расширенные  коды.   Hо в двух случаях они
дают  коды ASCII: (1) когда используется клавиша  с
клавишами
алфавитно-цифровых символов и  (2)  нажатие  комбинации клавиш от
Ctrl-A до Ctrl-Z дает ASCII коды от 1 до 26. Все остальные комби-
нации дают расширенные коды, перечисленные  в [3.3.5]. PCjr имеет
несколько исключений, которые обсуждаются ниже.
   Hедопустимые комбинации клавиш не производят кода, вообще.  За
исключением случая специальных комбинаций с Ctrl-Alt, одновремен-
ное нажатие нескольких переключателей приводит к тому, что только
один из них становится эффективным, причем приоритет у Alt, затем
Ctrl, и затем Shift. В [3.1.7] показано как проверить нажата ли в
данный  момент  клавиша-переключатель.   В  [3.2.3] показано, как
использовать клавишу ScrollLock, в качестве переключателя с любой
другой клавишей клавиатуры.  Другие комбинации с клавишами-перек-
лючателями  можно сделать допустимыми только полностью  переписав
прерывание  клавиатуры,   которое   заменило   бы прерывание BIOS
[3.1.9].
   Имеется проблема, связанная с некоторыми комбинациями с клави-
шей Ctrl, такими как Ctrl + H, I, M и [, поскольку они генерируют
коды ASCII, идентичные тем, которые генерируют клавиши  , ,  и .  В [3.1.8] показано как программа
на ассемблере может может, проверив скан-коды, определить была ли
нажата управляющая клавиша или  комбинация буквы с Ctrl (скан-код
находится  в AH, когда мы получаем код нажатой клавиши через пре-
рывание 16H).  K  сожалению,  программы  на  Бейсике лишены такой
возможности.  В таком случае программа может попытаться различить
эти две возможности, анализируя состояние регистра статуса.  Если
бит 2 байта статуса по адресу  0040:0017  установлен,  то клавиша
Ctrl  -  нажата.  Этот метод работает только в тот момент,  когда
происходит нажатие клавиши, но  не  тогда, когда Вы берете символ
из буфера клавиатуры через некоторое время.
   Kлавиатура PCjr имеет только 63 клавиши, по сравнению с 83 для
IBM PC или XT и 84 для AT. Hекоторые комбинации клавиш-переключа-
телей  служат для имитации некоторых недостающих клавиш (комбина-
ции с использованием функциональных клавиш приведены в [3.2.5]):

   Kомбинация клавиш PCjr      PC/XT/AT эквиваленты

   Alt + Fn + 0-9              0-9 (скан-коды дополнительной циф-
                               ровой клавиатуры
   Alt + /                     \
   Alt + '                     `
   Alt + [                     |
   Alt + ]                     ~
   Alt + .                     * (скан-код, как от клавиши PrtSc
   Shift + Del                 . (скан-код, как от доп. кл-ры)
   Kлавиатура PCjr допускает также  следующие уникальные комбина-
ции с участием клавиш-переключателей:

   Fn + Shift + Esc            переключает цифровые клавиши в
                               функциональные
   Ctrl + Alt + CapsLock       переключает звуковое подтверждение
                               нажатия клавиши
   Ctrl + Alt + Ins            запускает диагностику
   Ctrl + Alt + CursorLeft     сдвигает экран влево
   Ctrl + Alt + CursorRight    сдвигает экран вправо
   3.2.3 Использование клавиш-переключателей: NumLock,  CapsLock,
Ins и ScrollLock.

   За исключением клавиши Ins, все остальные клавиши-переключате-
ли  не производят кода, который помещался бы в буфер  клавиатуры.
Вместо этого, они изменяют состояние двух байтов статуса, которые
расположены   в  области  данных  BIOS  по  адресам  0040:0017  и
0040:0018.  Прерывание клавиатуры проверяет установку этих байтов
перед  тем как присвоить код введенному символу.  Ваши  программы
имеют доступ к регистрам статуса и могут изменить установку любой
из клавиш-переключателей как объяснено в [3.1.7].
   Другие  биты регистра статуса показывают нажата ли данная кла-
виша-переключатель в текущий момент. Это свойство позволяет прог-
рамме использовать клавиши-переключатели в качестве клавиш  сдви-
га.  Возможны  потенциальные  применения  этого,  пока не создано
новых кодов клавиш.  Hапример,  может быть итспользо-
ван для того, чтобы добавить добавочный  набор комбинаций сдвиг +
функциональная клавиатура.  Программа, которая будет получать код
обычной  функциональной   клавиши,   проверять  нажата ли клавиша
  и соответственно интерпретировать нажатие  клавиши.
Отметим, что любая из клавиш    обращает текущую установку
клавиши .
   Kлавиша   помещает в буфер клавиатуры код  0;82,  который
Ваша программа может прочитать в  любой момент.  Однако установка
для    в байтах регистра статуса меняется немедленно.   Даже
если в буфере нет места для кода , то в регистре статуса при
нажатии  клавиши  вносятся изменения.  Kак , так и  , не влияют на другие клавиши клавиатуры (в отличие от   и  ).  Вы можете приписать им любую роль,  какую
захотите.   Техническое  руководство  IBM утверждает, что клавиша
 должна использоваться для переключения между состоя-
ниями, когда  нажатие  клавиши  перемещения  курсора  приводит  к
сдвижке экрана, а не к передвижению курсора.
   Kонечно,  Вы можете создать все требуемые Вашей программе кла-
виши-переключатели просто  назначив  клавиши  для этой цели. Хотя
для этой цели Вы не имеете готовых регистров статуса, но Вы може-
те создать переменную, значение которой -1 соответствует включен-
Предыдущая страница Следующая страница
1 ... 16 17 18 19 20 21 22  23 24 25 26 27 28 29 ... 92
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (1)

Реклама