Определение нажатия комбинации клавиш средствами BIOS на ассемблере

Thu 03 December 2009

По учебе понадобилось написать программу на ассемблере, которая должна распознать нажатие «горячей» комбинации клавиш LeftCtrl+RightShift+F3 и реагировать на него звуковым сигналом. Информации/примеров по этой теме маловато, по этому решил опубликовать свою программку.

masm
.model small
.stack 256
.data
    Msg_about db 'Распознать нажатие «горячей» комбинации клавиш', 0Ah, 0Dh
              db 'LeftCtrl+RightShift+F3', 0Ah, 0Dh
              db 'и реагировать на него звуковым сигналом', 0Ah, 0Dh, '$'

.code

start:
    ; Инициализация сегментного регистра ds
    mov ax, @data
    mov ds, ax

    ; Видеорежим 3 (очистка экрана и установка курсора в 0, 0)
    mov ax, 0003h
    int 10h

    ; Вывод сообщения на экран
    mov ah, 9
    mov dx, offset Msg_about
    int 21h

    ; Чтение символа с ожиданием
    mov ah, 0
    int 16h

    ; Проверка нажатия Ctrl+F3
    cmp ah, 60h
    jne exit

    ; Получение состояния клавиатуры
    mov ah, 12h
    int 16h

    ; Проверка нажатия LeftCtrl
    test ah, 1b
    jz exit

    ; Проверка нажатия RightShift
    test al, 1b
    jz exit

    mov ah, 2 ; Вывод символа
    mov dl, 7 ; Сигнал
    int 21h

    ; Завершение программы, возврат управления ОС
    exit:
    mov ax, 4c00h
    int 21h
end start

Для чтения символа используется функция 16h BIOS.

AH = 0

На выходе в AL = ASCII-код символа, 0 или префикс скан-кода, АН = скан-код нажатой клавиши или расширенный ASCII-код.

Далее производится сравнение регистра AH со скан-кодом 60h (нажатие Ctrl+F3).

Потом получаем состояния клавиатуры. Используется функция 16h BIOS.

AH = 12h

На выходе в AX заносится состояние клавиатуры. Нас интересует только первый бит AH (LeftCtrl) и первый бит AL (RightShift).

Состояние клавиатуры

AL

  • Бит 7: Ins
  • Бит 6: CapsLock
  • Бит 5: NumLock
  • Бит 4: ScrollLock
  • Бит 3: Alt (любой Alt для функции 02h, часто только левый Alt для 12h/22h)
  • Бит 2: Ctrl (любой)
  • Бит 1: LeftShift
  • Бит 0: RightShift

AH

  • Бит 7: SysRq
  • Бит 6: CapsLock
  • Бит 5: NumLock
  • Бит 4: ScrollLock
  • Бит 3: RightAlt
  • Бит 2: RightCtrl
  • Бит 1: LeftAlt
  • Бит 0: LeftCtrl

Category: Misc Tagged: assembler

Comments