Меню сайта

Урок 160. Процедура BIOS клавиатуры изнутри

Мы не собираемся построчно анализироватьпрограмму клавиатуры BIOS.
— — — Но в ней, однако, есть интересныеместа. — Некоторые из них мы
— — — упомянули раньше, например подпрограмму K4,которая сдвигает
— — — указатель буфера.
— — — — — Программа KB_INT использует несколькотаблиц значений клавиш.
— — — Если вы посмотрите программу, то увидите,что эти таблицы
— — — используются различными способами.Таблицы, содержащие значения
— — — кодов сканирования, используются дляпоиска шаблонов. BIOS
— — — сравнивает код сканирования клавиатуры созначениями в таблице.
— — — — — — — — — — -Microsoft (R) Macro Assembler Version 5.00 — — — — — — — — — — — — — — 1/1/8004:06:15
— — — — — — — — — — — -Фиг. 9.3 Состояние клавиатуры — — — — — — — — — — — — — — — — — — — — — — — — — — — Page — — — -1-1

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -PAGE ,132
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -TITLE — — — — — Фиг. 9.3 Состояние клавиатуры
— — — — — — — — — — — -0000 — — — — — — — — — — — — — — — — — — — — — — — STACK — — — — — SEGMENT STACK
— — — — — — — — — — — -0000 — — — — — 0040[ — — — — — — — — — — — — — — — — — — DW — — 64 DUP (?)
— — — — — — — — — — — — — — — — — — — — ????
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ]
— — — — — — — — — — — -0080 — — — — — — — — — — — — — — — — — — — — — — — STACK — — — — — ENDS
— — — — — — — — — — — -0000 — — — — — — — — — — — — — — — — — — — — — — — CODE SEGMENT
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -ASSUME -CS:CODE
— — — — — — — — — — — -0000 — — — — — 0000 — — — — — — — — — — — — — LITTLE — DW 0
— — — — — — — — — — — -0002 — — — — — 0000 — — — — — — — — — — — — — BIG — DW — — 0
— — — — — — — — — — — -0004 — — — — — — — — — — — — — — — — — — — — — — — COUNT — — — — — PROC FAR
— — — — — — — — — — — -0004 — — — — — 1E — — — — — — — — — — — — — — — — — — — — — PUSH DS — — — — — — — — — Адрес возврата в ДОС
— — — — — — — — — — — -0005 — — — — — 2B C0 — — — — — — — — — — — — — — — — — — SUB — AX, AX
— — — — — — — — — — — -0007 — — — — — 50 — — — — — — — — — — — — — — — — — — — — — PUSH AX
— — — — — — — — — — — -0008 — — — — — — — — — — — — — — — — — — — — — — — ADD_ONE:
— — — — — — — — — — — -0008 — — — — — 2E: FF 06 0000 R — — — — — — — INC — LITTLE
— — — — — — — — — — — -000D — — — — — 75 05 — — — — — — — — — — — — — — — — — — JNZ — STILL_LOW
— — — — — — — — — — — -000F — — — — — 2E: FF 06 0002 R — — — — — — — INC — BIG
— — — — — — — — — — — -0014 — — — — — — — — — — — — — — — — — — — — — — — STILL_LOW:
— — — — — — — — — — — -0014 — — — — — B4 01 — — — — — — — — — — — — — — — — — — MOV — AH, 1 — — — — — — — — — — — — Программаопроса статуса клавиатуры
— — — — — — — — — — — -0016 — — — — — CD 16 — — — — — — — — — — — — — — — — — — INT — 16H
— — — — — — — — — — — -0018 — — — — — 74 EE — — — — — — — — — — — — — — — — — — JZ — — ADD_ONE — — — — Переход, еслинет символа в буфере ввода
— — — — — — — — — — — -001A — — — — — B4 00 — — — — — — — — — — — — — — — — — — MOV — AH, 0
— — — — — — — — — — — -001C — — — — — CD 16 — — — — — — — — — — — — — — — — — — INT — 16H — — — — — — — — Чтение символа
— — — — — — — — — — — -001E — — —
— — 3C 20 — — — — — — — — — — — — — — — — — — CMP — AL, ‘ ‘ — — — — — — — — — Сравнениес пробелом
— — — — — — — — — — — -0020 — — — — — 75 E6 — — — — — — — — — — — — — — — — — — JNZ — ADD_ONE — — — — Переход, еслине пробел
— — — — — — — — — — — -0022 — — — — — CB — — — — — — — — — — — — — — — — — — — — — RET — — — — — — — — — — — — — — Возврат в ДОС
— — — — — — — — — — — -0023 — — — — — — — — — — — — — — — — — — — — — — — COUNT — — — — — ENDP
— — — — — — — — — — — -0023 — — — — — — — — — — — — — — — — — — — — — — — CODE ENDS
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -END — COUNT

— — — — — — — — — — — -Фиг. 9.3 Состояние клавиатуры

— — — Команда REPNE SCASB, используемая послеметки K16, позволяет BIOS
— — — просмотреть таблицу в поисках соответствияс одной из регистровых
— — — клавиш. Когда BIOS находит соответствие втаблице кодов
— — — сканирования, она использует смещение втаблице для получения
— — — значения маски, используемого вместе спеременной KB_FLAG. Так как
— — — все регистровые клавиши представленыбитами в переменных флагов,
— — — единая программа, пользуясь этимитаблицами, может управлять
— — — регистровыми клавишами.

— — — — — BIOS использует также другие таблицы дляперекодировки кодов
— — — сканирования в коды ASCII. Определивтекущее состояние регистров,
— — — BIOS загружает в регистр BX указатель нанужную таблицу кодов
— — — ASCII. Затем программа преобразует кодсканирования в правильное
— — — начальное значение выбранной таблицы(вычитая начальный адрес
— — — таблицы). Команда XLAT переводит кодсканирования в правильный код
— — — ASCII. Этот прием используется там, гдеBIOS порождает коды
— — — псевдосканирования цифровой клавиатуры врежиме использования
— — — регистра клавиатуры CONTROL (метка K63).

— — — — — Подпрограмма ERROR_BEEP — примеруправления динамиком, которое
— — — мы разбирали в предыдущей главе- онапорождает сигнал, который BIOS
— — — посылает всегда, когда оператор вводитсимвол, а буфер полон. Так
— — — как этот сигнал может возникнуть всякийраз, когда система
— — — обслуживает прерывание от клавиатуры, былобы неразумно менять
— — — значение счетчика в канале таймера,управляя динамиком. Для этой
— — — цели BIOS использует непосредственноеуправление динамиком. Если
— — — уже генерируется какой-либо звук, онобрывается и появляется сигнал
— — — о переполнении клавиатуры. Если вывнимательно послушаете сигнал
— — — переполнения, то заметите, что он слегкадрожит. Возникающее 18 раз
— — — в секунду прерывание таймера меняет тон,прерывая цикл прямого
— — — управления динамиком. Как было предложенов предыдущей главе, вы
— — — можете исследовать последствияиспользования различных временных
— — — циклов таймера на выходную тональностьдинамика.

Категория: Программирование на Ассемблере | Дата: 02.03.13

Меню раздела
Блок