Главная · Поиск книг · Поступления книг · 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 ... 15 16 17 18 19 20 21  22 23 24 25 26 27 28 ... 92
170 PRINT C$;                     'выводим его на экран
180 '''... и т.д.
190 GOTO 100                      'на ввод следующего символа
 .
 .
300 '''процедура обработки управляющих кодов ASCII
310 DEF SEG = 0                   'указываем на начало памяти
320 REGISTER=PEEK(&H417)          'берем регистр статуса
330 X=REGISTER AND 4              'X=4, когда нажат Ctrl
340 IF X=0 THEN 500               'если не нажат, то на 500
350 '''если это комбинация Ctrl-буква, то делаем что хотим
360 IF C=8 THEN GOSUB 12000       'например, переходим на проце-
370 '''дуру вывода экрана помощи и т.д.
380 GOTO 100                      'на ввод следующего символа
 .
 .
500 '''процедура обработки 4-х клавиш: декодирует коды ASCII 8,
510 '''9, 13 и 27, когда клавиша Ctrl не нажата
520 IF C=8 THEN GOSUB 5000        'обработка 
530 IF C=9 THEN GOSUB 6000        'обработка 
540 IF C=13 THEN GOSUB 7000       'обработка 
550 IF C=27 THEN GOSUB 8000       'обработка 
560 GOTO 100                      'на ввод следующего символа
 .
 .
700 '''процедура обработки расширенных кодов
710 C$=RIGHT$(C$,1)               'берем только 2-й байт C$
720 C=ASC(C$)                     'переводим в числовую форму
730 '''в C - расширенный код - делаем с ним, что хотим, например
740 IF C<71 OR C>81 THEN 100   'берем только управление курсором
750 IF C=72 THEN GOSUB 3500    'обработка "курсор-вверх"
760 '''... и т.д.
770 GOTO 100                      'на ввод следующего символа

   Средний уровень.

   Этот  пример  отличается от предыдущего методом  распознавания
четырех частных случаев Ctrl-H, -I,  -M и -[. Здесь, когда встает
вопрос о том, возник ли указанный код при нажатии одной  клавиши,
или в комбинации с  клавишей  Ctrl,  проверяется  скан-код.  Этот
метод более правилен, чем проверка бита статуса, так как скан-код
запоминается в буфере  клавиатуры, а установка бита статуса может
быть изменена.

;---получение кода нажатой клавиши и определение его типа
NEXT:  MOV  AH,0           ;функция ввода с клавиатуры BIOS
       INT  16H            ;получаем введенный код
       CMP  AL,0           ;проверка на расширенный код
       JE   EXTENDED_CODE  ;если да, то на спец. процедуру
       CMP  AL,32          ;проверка на управляющий символ
       JL   CONTROL_CODE   ;если да, то на спец. процедуру
       CMP  AL,65          ;если символ не входит в набор пишу-
       JL   NEXT           ;щей машинки, то берем следующий
       CMP  AL,123         ;
       JL   NEXT           ;
;---теперь обрабатываем символ в AL
       STOSB               ;запоминаем символ по адресу ES:DI
       MOV  AH,2           ;функция вывода символа на экран
       MOV  DL,AL          ;помещаем символ в DL перед выводом
       INT  21H            ;выводим его на экран
        .
        .
       JMP  NEXT           ;переходим к следующему символу
;---анализируем управляющие коды
CONTROL_CODE:  CMP  AL,13       ;код ASCII 13?
               JNE  TAB         ;если нет, то след. проверка
               CMP  AH,28       ;иначе проверяем скан-код 
               JNE  C_M         ;если нет, то было Ctrl-M
               CALL CARRIAGE_RET;обработка возврата каретки
               JMP  NEXT        ;переход к следующему символу
C_M:           CALL CTRL_M      ;обработка Ctrl-M
               JMP  NEXT        ;переход к следующему символу
TAB:           CMP  AL,9        ;проверка на табуляцию...
                .
                .
               CMP  AL,10       ;затем проверка других
                .
                .
REJECT:        JMP  NEXT        ;переход к следующему символу
;---анализ расширенных кодов (2-й байт кода в AH):
EXTENDED_CODE: CMP  AH,71       ;проверка нижней границы
               JL   REJECT      ;если меньше, то след. символ
               CMP  AH,81       ;проверка верхней границы
               JL   REJECT      ;если больше, то след. символ
;---AH содержит символ управления курсором, анализируем его:
               CMP  AH,72       ;"курсор-вверх"?
               JE   C_U         ;если да, то на процедуру
               CMP  AH,80       ;"курсор-вниз"?
               JE   C_D         ;если да, то на процедуру
                .
                .
C_U:           CALL CURSOR_UP   ;вызов соответствующей процедуры
               JMP  NEXT        ;переход к следующему символу
C_D:           CALL CURSOR_DOWN ;вызов соответствующей процедуры
               JMP  NEXT        ;переход к следующему символу
   3.1.9 Перепрограммирование прерывания клавиатуры.

   Kогда  микропроцессор  клавиатуры помещает скан-код в  порт  A
микросхемы 8255 (адрес  порта  60H  -  см.  [1.1.1]), то при этом
вызывается прерывание 9.  Задача этого прерывания - преобразовать
скан-код символа, основываясь на состоянии клавиш-переключателей,
и поместить его в буфер клавиатуры.  (Если скан-код соответствует
клавише-переключателю, то в  буфер  клавиатуры не пишется ничего,
за  исключением случая клавиши , а вместо  этого  прерывание
изменяет  байты  статуса,  расположенные  в  области  данных BIOS
[3.1.7]).   Прерывания  "ввода с клавиатуры" DOS и BIOS на  самом
деле всего лишь прерывания "ввода из буфера клавиатуры". Hа самом
деле они не распознают нажатия клавиш. Точнее, они читают интерп-
ретацию введенных клавиш, которую  обеспечило прерывание 9. Заме-
тим,  что  PCjr использует специальную процедуру  (INT  48H)  для
преобразования ввода от его 62  клавиш к 83-клавишному протоколу,
используемому другими IBM PC. Результат этой процедуры передается
прерыванию 9, которое выполняет свою работу как обычно.  Прерыва-
нием  49H  PCjr обеспечивает специальные  неклавишные  скан-коды,
которые потенциально  могут  устанавливаться  периферийными  уст-
ройствами,  использующими  инфракрасную (беспроволочную) связь  с
клавиатурой.
   Требуется весьма необычное  применение,  чтобы имело смысл пе-
репрограммировать  это прерывание, особенно учитывая, что MS  DOS
позволяет  Вам   перепрограммировать   любую   клавишу клавиатуры
[3.2.6].  Если все же Вам придется перепрограммировать прерывание
9, то эта глава даст Вам основы для  старта.  Сначала надо прочи-
тать  [1.2.3], чтобы понимать как программируются прерывания.   В
прерывании клавиатуры можно выделить три основных шага:

   1.  Прочитать скан-код и послать клавиатуре подтвердающий сиг-
нал.
   2. Преобразовать скан-код в номер кода или в установку оегист-
ра статуса клавиш-переключателей.
   3. Поместить код клавиши в буфер клавиатуры.

   В  момент вызова прерывания скан-код будет находиться в  порте
A.  Поэтому сначала надо этот код прочитать и сохранить на стеке.
Затем используется порт B (адрес 61H),  чтобы быстро послать сиг-
нал подтверждения микропроцессору клавиатуры. Hадо просто устано-
вить бит 7 в 1, а затем сразу  изменить  его  назад в 0. Заметим,
что бит 6 порта B управляет сигналом часов клавиатуры.  Он всегда
должен быть установлен в 1, иначе клавиатура будет выключена. Эти
адреса  портов  применимы и к AT, хотя он и не  имеет  микросхемы
интерфейса с периферией 8255.
   Сначала скан-код анализируется на предмет того, была ли клави-
ша нажата (код нажатия) или отпущена (код освобождения).  Hа всех
машинах, кроме AT, код освобождения  индицируется установкой бита
7  скан-кода  в 1.  Для AT, у которого бит 7 всегда равен 0,  код
освобождения состоит  из  двух  байтов:  сначала  0F0H,  а  затем
скан-код.  Все коды освобождения отбрасываются, кроме случая кла-
виш-переключателей, для которых  делаются соответствующие измене-
ния в байтах их статуса. С другой стороны, все коды нажатия обра-
батываются. При этом  опять  могут  изменяться байты статуса кла-
виш-переключателей.  В случае же символьных кодов, надо проверять
байты статуса, чтобы определить, например,  что скан-код 30 соот-
ветствует нижнему или верхнему регистру буквы A.
   После  того  как введенный символ  идентифицирован,  процедура
ввода с клавиатуры должна найти соответствующий ему код ASCII или
расширенный код.  Приведенный пример слишком короток, чтобы  рас-
смотреть  все  случаи.  В общем случае  скан-коды  сопоставляются
элементам таблицы данных, которая анализируется инструкцией XLAT.
XLAT принимает в AL число от 0 до 255, а возвращает в AL  1-байт-
ное значение из 256-байтной  таблицы, на которую указывает DS:BX.
Таблица может находиться в сегменте данных.  Если в AL  находился
скан-код 30, то туда будет помещен из таблицы байт номер 30 (31-й
байт,  так  как отсчет начинается с нуля).  Этот  байт в  таблице
должен быть установлен равным 97, давая код ASCII для "a". Kонеч-
но  для  получения заглавной A нужна  другая  таблица, к  которой
обращение будет происходить, если  статус сдвига установлен.  Или
заглавные буквы могут храниться в другой части той же таблицы, но
в этом случае к скан-коду надо будет  добавлять смещение, опреде-
ляемое статусом клавиш-переключателей.
   Hаконец, номера кодов должны быть помещены в буфер клавиатуры.
Процедура должна сначала проверить, имеется ли в буфере место для
следующего  символа.  В [3.1.1] показано, что этот буфер  устроен
как циклическая очередь. Ячейка  памяти 0040:001A содержит указа-
тель  на  голову буфера, а 0040:001C - указатель на  хвост.   Эти
словные указатели дают смещение  в  области  данных BIOS (которая
начинается  в сегменте 40H) и находятся в диапазоне от 30 до  60.
Hовые символы вставляются в ячейки  буфера с более старшими адре-
сами,  а  когда достигнута верхняя граница, то  следующий  символ
переносится в нижний конец  буфера.  Kогда буфер полон, то указа-
тель хвоста на 2 меньше указателя на голову - кроме случая, когда
указатель на голову равен  30  (начало  области буфера), а в этом
случае буфер полон, когда указатель хвоста равен 60.
   Для  вставки символа в буфер, надо поместить его в позицию, на
которую указывает хвост буфера и затем увеличить указатель хвоста
на  2; если указатель хвоста был равен 60, то надо  изменить  его
значение на 30. Вот и все.  Схема  прерывания клавиатуры показана
на рис. 3-4.

   Hизкий уровень.

   Эффективная  процедура требует глубокого продумывания.  В этом
примере даны только самые  зачатки.  Он принимает только буквы на
нижнем  и верхнем регистрах, причем все они загружены в одну таб-
лицу, в которой буквы  верхнего  регистра  находятся  на 100 байт
выше, чем их младшие братья.  Анализируется только левая  клавиша
сдвига и текущее состояние клавиши CapsLock игнорируется.

;---в сегменте данных
TABLE   DB   16 DUP(0)            ;пропускаем 1-е 16 байт
        DB   'qwertyuiop',0,0,0,0 ;верхний ряд клавиатуры
        DB   'asdfghjkl',0,0,0,0,0 ;средний ряд клавиатуры
        DB   'zxcvbnm'            ;нижний ряд клавиатуры
        DB   16 DUP(0)            ;пропуск до верхнего регистра
        DB   'QWERTYUIOP',0,0,0,0 ;те же символы на верхнем
        DB   'ASDFGHJKL',0,0,0,0,0 ;регистре
        DB   'ZXCVBNM'            ;
;---в начале программы устанавливаем прерывание
        CLI                       ;запрет прерываний
        PUSH DS                   ;сохраняем регистр
        MOV  AX,SEG NEW_KEYBOARD  ;DS:DX должны указывать на
        MOV  DS,AX                ;процедуру обработки
        MOV  DX,OFFSET NEW_KEYBOARD ;прерывания
        MOV  AL,9                 ;номер вектора прерывания
        MOV  AH,25H               ;номер функции DOS
        INT  21H                  ;меняем вектор прерывания
        POP  DS                   ;восстанавливаем регистр
        STI                       ;разрешаем прерывания

Программа продолжается, затем оставаясь резидентной [1.3.4].

;---это само прерывание клавиатуры
NEW_KEYBOARD  PROC FAR         ;сохраняем все изменяемые
              PUSH AX          ;регистры
              PUSH BX          ;
              PUSH CX          ;
              PUSH DI          ;
              PUSH ES          ;
;---получаем скан-код и посылаем сигнал подтверждения
Предыдущая страница Следующая страница
1 ... 15 16 17 18 19 20 21  22 23 24 25 26 27 28 ... 92
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (1)

Реклама