Advertisement
Guest User

Ассемблер. Издает звуковой сигнал при нажатии на клавишу F12

a guest
Jun 28th, 2019
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CdDt GROUP Code, Data, InCode
  2. ASSUME CS: CdDt, DS: CdDt
  3. CODE SEGMENT PUBLIC
  4.     ORG 2Ch
  5. BlOkr DW ?
  6.     ORG 100h
  7.    
  8. Main:
  9.     JMP InitP       ; Переход на инициализацию
  10. Begin:  
  11.     PUSHF           ; Сохранение содержимого
  12.     PUSH AX         ; регистров в стеке
  13.     IN AL, 60h      ; считываем код клавиши
  14.     MOV AH, AL      ; и пересылаем в AH
  15.     CMP AL, 1       ; проверка на <ESC>
  16.     JE ExitDrv      ; выход из драйвера
  17.     AND AH, 7Fh     ; сброс старшего бита
  18.     CMP AH, 58h     ; проверка на нажатие/отпускание <F12>
  19.     JNE OldEx       ; передача управления старому обработчику
  20.                 ; если не равно
  21.     PUSH AX         ; Помещаем AX в стек
  22.     CALL KeyInt     ; аппаратная обработка
  23.     POP AX          ; Извлекаем AX из стека (AL <- код клавиши)
  24.     AND AL, AL      ; Установка флагов
  25.     JS F12_Up       ; переход, если флаг знака SF = 1 (кнопка отпущена)
  26.     ; иначе, клавиша нажата
  27.     MOV AX, 725     ; загрузка коэффициента
  28.     OUT 42h, AL     ; выводим мл. байт
  29.     MOV AL, AH
  30.     OUT 42h, AL     ; выводим старший байт
  31.     IN AL, 61h
  32.     OR AL, 03h
  33.     OUT 61h, AL     ; разрешаем звучание
  34.     JMP Exit        ; К выходу  
  35. F12_Up:
  36.     IN AL, 61h
  37.     AND AL, 0FCh
  38.     OUT 61h, AL     ; запрет звучания
  39. Exit:
  40.     POP AX          ; Восстановление содержимого
  41.     POPF            ; регистров из стека
  42.     IRET            ; Возврат из прерывания
  43. OldEx:
  44.     POP AX          ; Восстановление содержимого
  45.     POPF            ; регистров из стека
  46.     JMP DWORD PTR CS:OldV9  ; передача управления старому обработчику
  47. ExitDrv:
  48.     CALL KeyInt     ; аппаратная обработка
  49.     PUSH DX
  50.     PUSH DS
  51.     PUSH ES
  52.     MOV AX, 2509h       ; восстанавливаем адрес
  53.     MOV DX, CS:OldV9   
  54.     MOV DS, CS:OldV9+2
  55.     INT 21h         ; значения вектора 09
  56.     MOV AH, 49h         ; Освобождение области памяти,
  57.     MOV AX, CS      ; занимаемой
  58.     MOV ES, AX     
  59.     INT 21h         ; драйвером
  60.     POP ES          ; Восстановление содержимого
  61.     POP DS          ; регистров из стека
  62.     POP DX
  63.     POP AX         
  64.     POPF           
  65.     IRET            ; Возврат из прерывания
  66.  
  67. KeyInt:
  68.     IN AL, 61h      ; взять значениe порта управления клавиатурой
  69.     MOV AH, AL              ; сохранить его
  70.         OR AL, 80h      ; установить бит разрешения для клавиатуры
  71.     OUT 61h, AL     ; и вывести его в управляющий порт
  72.     XCHG AH, AL     ; извлечь исходное значение порта
  73.     OUT 61h, AL     ; и записать его обратно
  74.     MOV AL, 20h     ; послать сигнал "конец прерывания"
  75.     OUT 20h, AL     ; контроллеру прерываний
  76.     RET
  77.  
  78. CODE ENDS
  79.  
  80. DATA SEGMENT
  81. ; Данные программы
  82. Txt DB 13
  83.     DB 218, 8 DUP(196), 191, 13, 10
  84.     DB 179, '00/00/00', 179, 13, 10
  85.     DB 192, 8 DUP(196), 217, 13, 10, 0
  86. OldV9   DW 0, 0
  87. DATA ENDS
  88.  
  89. ; Инициализационная часть программы
  90. InCode SEGMENT
  91. InitP:  
  92.     MOV AX, 3509h
  93.     INT 21h         ; чтение вектора 09
  94.     MOV OldV9, BX       ; сохраняем значение вектора
  95.     MOV OldV9+2, ES     ; в ОЗУ
  96.     MOV AX, 2509h      
  97.     LEA DX, Begin       ; установка нового
  98.     INT 21h         ; значения вектора 09
  99.     MOV AH, 49h         ; Освобождение области памяти,
  100.     MOV ES, BlOkr       ; занимаемой
  101.     INT 21h         ; блоком окружения
  102.     LEA DX, InitP       ; Возврат в DOS, оставшись
  103.     INT 27h         ; резидентным
  104. InCode ENDS
  105.  
  106. END Main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement