1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
| model small
.stack 100h
.data
Mes1 db 10, 13, 'Нажмите любую клавишу $'
Mes2 db 10, 13, 'Программа завершена','$'
Mes3 db 10, 13, 'Ошибка контроллера$'
.code
start:
mov ax, @data
mov ds, ax
; вывод приглашения
main: lea dx, Mes1
mov ah, 9h
int 21h
; ожидание нажатия клавиши, считывание кода (без "Эхо")
mov ah, 8h
int 21h ; в AL код введенного символа (первый байт)
; Идентификация введенного кода:
and al, al ; AL = 0? (код расширенный?)
jne ascii ; если нет -> на метку ascii
; если да (код расширенный) -> на след. команду
int 21h ; вторичный вызов для получ. в AL 2-го байта кода
cmp al, 49h ; сравнение второго байта кода со скан-кодом PgUp
jne kon ; если не равно (расширенный, но не PgUp),
; переход на метку kon
; равно, т.е. введен PgUp !!!
;******************** БЛОК 1 *******************************
; работа с контроллером клавиатуры (см. подробно в п. 1.3.3)
cli ; запрет маскируемых прерываний
xor cx, cx
wait1: ; цикл ожидания освобождения буфера
in al, 64h
test al, 10b
loopnz wait1
jnz er ; если буфер занят -> вывод ошибки
mov al, 0EDh ; отправка команды управления светодиодами
out 60h, al
xor cx, cx
wait2: ; цикл ожидания освобождения буфера
in al, 64h
test al, 10b
loopnz wait2
jnz er ; если буфер занят -> вывод ошибки
; отправка второго байта
mov al, 000b ; погасить все индикаторы
out 60h, al
sti ; разрешение маскируемых прерываний
jmp main ; БЛОК 1 завершен -> новый ввод
;*********************************************************
ascii:
cmp al, 'd' ; в al код 'd' ?
jne kon ; нет (это и не 'd', и не PgUp) -> на метку kon
; в al код 'd' !!!
;************************ БЛОК 2 ************************
; считывание байта состояния в AL
xor ax, ax
mov es, ax
mov al, es:[417h]
xor dl, dl ; счетчик индикаторов
rol al, 1
rol al, 1
adc dl, 0 ; учитываем CapsLock
rol al, 1
adc dl, 0 ; учитываем NumLock
rol al, 1
adc dl, 0 ; учитываем ScrollLock
add dl, '0' ; получаем символ, соответствующий цифре
; вывод числа включенных светодиодов
mov ah, 02h
int 21h
jmp main ; БЛОК 2 завершен -> новый ввод
;******** ***************************************************
kon:
lea dx, Mes2 ; вывод сообщения «Программа завершена»
jmp exit
er: lea dx, Mes3 ; вывод сообщения «Ошибка контроллера»
exit: mov ah, 9h
int 21h
mov ah, 0 ; задержка до нажатия любой клавиши
int 16h
mov ax, 4C00h ; завершение программы
int 21h
end start |