Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Прощай, Мир!
 Аватар для proc3nt
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
TASM

Отследить одновременное нажатие клавиш клавиатуры

15.03.2021, 02:15. Показов 2554. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
прив! пытаюсь сделать одновременное движение двух точек, управляемых разными клавишами клавитуры.. левой точкой управляет клавиша 's', а правой точкой управляет стрелка вниз.. к сожалению, когда одновременно нажаты (зажаты, без отпусканий) обе клавиши, то только одна (любая) точка двигается вниз, а не обе вместе.. как выполнить задуманное?

Assembler
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
; модель памяти
.MODEL SMALL            
 
.DATA
LEFT_X DW 10     
LEFT_Y DW 10     
 
RIGHT_X DW 304   
RIGHT_Y DW 10 
 
LEFT_FLAG DB 0
RIGHT_FLAG DB 0   
 
OLD_HANDLER LABEL DWORD
OLD_HANDLER_OFF DW ?
OLD_HANDLER_SEG DW ?
 
.STACK 100h
 
.CODE
; точка входа в программу
start:
    ; инициализация сегмента данных
    mov ax,@data
    mov ds,ax
    
    ; установить графический режим 320x200 пикселей
    mov ax, 13h
    int 10h
 
    push es
    
    xor ax, ax
    mov es, ax
 
    ; сохранить стандартный обработчик прерывания клавиатуры
    mov ax, word ptr es:[09h*4]
    mov word ptr [OLD_HANDLER_OFF], ax
    mov ax, word ptr es:[09h*4+2]
    mov word ptr [OLD_HANDLER_SEG], ax
 
    cli
    ; установить пользовательский обработчик прерывания клавиатуры
    mov ax, cs
    mov word ptr es:[09h*4+2], ax
    mov ax, offset MoveDots
    mov word ptr es:[09h*4], ax
    sti
 
    pop es
    
    ; первоначальное рисование левой точки
    call DrawLeft
    ; первоначальное рисование правой точки
    call DrawRight
    
    ; некоторая задержка
    SomeDelay:                  
    
    jmp SomeDelay           
    
    exit:
    ; выход из программы
    mov ah, 4Ch             
    mov al, 0
    int 21h
 
; стереть левую точку
proc ClearLeft
    mov cx, [LEFT_X]    
    mov dx, [LEFT_Y]
    
    mov ah, 0Ch                 
    mov al, 0                   
    mov bh, 0                   
    int 10h                     
        
    ret 
endp ClearLeft
 
; стереть правую точку
proc ClearRight
    mov cx, [RIGHT_X]    
    mov dx, [RIGHT_Y]    
    
    mov ah, 0Ch                 
    mov al, 0                   
    mov bh, 0                   
    int 10h
 
    ret
endp ClearRight
 
; нарисовать левую точку
proc DrawLeft
    mov cx, [LEFT_X]    
    mov dx, [LEFT_Y]   
    
    mov ah, 0Ch                 
    mov al, 0Fh                  
    mov bh, 0                   
    int 10h                     
        
    ret
endp DrawLeft
 
; нарисовать правую точку
proc DrawRight
    mov cx, [RIGHT_X]   
    mov dx, [RIGHT_Y]    
        
    mov ah, 0Ch                 
    mov al, 0Fh                 
    mov bh, 0               
    int 10h                     
 
    ret
endp DrawRight
 
; изменить координату левой точки
proc MoveLeftDown
    cmp [LEFT_Y], 199
    je FinLeftMove
 
    add [LEFT_Y], 1
    
    FinLeftMove:
    ret
endp MoveLeftDown
 
; изменить координату правой точки
proc MoveRightDown
    cmp [RIGHT_Y], 199
    je FinRightMove
 
    add [RIGHT_Y], 1            
    
    FinRightMove:
    ret
endp MoveRightDown
 
; пользовательский обработчик прерывания клавиатуры для перерисовки точки
MoveDots proc
    ; запретить прерывания
    cli
 
    ; вызов стандартного обработчика клавиатуры
    pushf
    call dword ptr ds:[OLD_HANDLER]
 
    ; установить сегмент, в котором находятся указатели
    push 40h
    pop es
 
    KeyPress:
    ; загрузить указатели на голову и хвост буфера клавиатуры
    mov bx, es:[1Ah]
    mov dx, es:[1Ch]
 
    ; проверка наличия символа в буфере клавиатуры
    cmp bx, dx
    jne GetChar
    
    jmp FinMove
 
    GetChar:
    ; загрузить символ из буфера клавиатуры
    mov ax, word ptr es:[bx]
 
    ; очистить буфер клавиатуры
    mov word ptr es:[1Ah], dx
 
    ; проверка флагов приоритета движения
    cmp LEFT_FLAG, 0
    je PrimaryLeft
    
    cmp RIGHT_FLAG, 0
    je PrimaryRight
    
    PrimaryLeft:    
    ; если нажата клавиша 's', то движение левой точки вниз
    cmp al,'s'
    je LeftStepDown
 
    ; если нажата стрелка вниз, то движение правой точки вниз
    cmp ah, 50h 
    je RightStepDown
    
    jmp FinMove
    
    PrimaryRight:
    ; если нажата стрелка вниз, то движение правой точки вниз
    cmp ah, 50h 
    je RightStepDown
    
    ; если нажата клавиша 's', то движение левой точки вниз
    cmp al,'s'
    je LeftStepDown
    
    jmp FinMove
    
    LeftStepDown:
    ; стереть левую точку
    call ClearLeft
    ; изменить координату левой точки
    call MoveLeftDown
    ; нарисовать левую точку
    call DrawLeft
    
    ; левая точка перерисована, теперь приоритет будет у правой точки
    mov LEFT_FLAG, 1
    mov RIGHT_FLAG, 0
    
    jmp FinMove
    
    RightStepDown:
    ; стереть левую точку
    call ClearRight
    ; изменить координату левой точки
    call MoveRightDown
    ; нарисовать левую точку
    call DrawRight
    
    ; правая точка перерисована, теперь приоритет будет у левой точки
    mov LEFT_FLAG, 0
    mov RIGHT_FLAG, 1
    
    FinMove:
    ; разрешить прерывания
    sti
    
    ; возврат из пользовательского обработчика прерывания
    iret
MoveDots endp
; конец программы с указанием точки входа
end start
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.03.2021, 02:15
Ответы с готовыми решениями:

Как отследить одновременное нажатие нескольких клавиш?
Кто знает? Как отследить в программе на ассем. одновременное нажатие нескольких клавишь? НУ НИКАК НЕ ПОЛУЧАЕТСЯ!:-|

[Qt] Одновременное нажатие клавиш
Задача: по нажатию одновременно двух клавиш необходимо воспроизведение звукового файла. Вот код: сначала создал QSet для хранения...

Одновременное нажатие клавиш
Как сделать так, чтобы при нажатии w с d, w с a, s с d, s с a, объект двигался по диагонали? Желательно напишите код.

7
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4491 / 1669
Регистрация: 01.02.2015
Сообщений: 13,899
Записей в блоге: 12
15.03.2021, 07:41
Нужно напрямую обрабатывать данные из порта клавиатуры, не отдавая управление исходному обработчику прерывания 09h.
Смысл в том, что из порта можно получить код нажатия клавиши и другой код отпускания этой же клавиши, это позволяет программе пользователя отслеживать одновременные нажатия.
Очень подробно об этом, с примерами, написано в главе 1
Владимир Кулаков «Программирование на аппаратном уровне» - лучше всего 2-е издание этой книги
В примере list1_06 показан перехват int 09h и обработка без передачи исходному обработчику.

Думаю, что придётся ещё и прерывание таймера перехватывать, но это позже.

Добавлено через 57 секунд
Посмотрите ещё
По нажатию кнопки прекратить выполнение прерывания 1Ch
1
Прощай, Мир!
 Аватар для proc3nt
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
15.03.2021, 21:25  [ТС]
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
придётся ещё и прерывание таймера перехватывать
ФедосеевПавел, какое назначение предполагается
для пользовательского обработчика таймера?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4491 / 1669
Регистрация: 01.02.2015
Сообщений: 13,899
Записей в блоге: 12
15.03.2021, 22:23
Как мне представляется, для отсчёта паузы между повтором действия (перемещения точки) при нажатой и удерживаемой клавише.

Я бы сделал так - в обработчике прерывания клавиатуры заполнял битовый массив по нажатой клавише (нужно только отслеживать и игнорировать 2 и более байтные последовательности для ряда клавиш). А уже в основной программе следил за 0 или 1 в нужном бите, начинал отсчёт паузы, перемещал и т.д. Т.е. описание свойств объекта (точки) хранилось бы в структуре с полями - координаты, длительность паузы перед повтором, количество тактов таймера при предыдущем действии (перемещении) из ячейки [0000:046C] - начало отсчёта.

Может быть перехватывать таймер и нет необходимости, достаточно значения из BDA [0000:046C]
1
Модератор
1245 / 676 / 292
Регистрация: 10.11.2019
Сообщений: 1,406
16.03.2021, 10:36
У меня сохранился небольшой код, написанный для вызова из Quick Basic
Но надо подходить к такому коду очень осторожно, чтобы не подвесить компьютер,
а лучше тренироваться на каком-нибудь старом компе, если он есть.

Assembler
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
; Этот код был написан как библиотечный для игры на QB 4.5
 
KDEBUG=0
 
delay   macro
    local m
    mov cx,5
m:      loop m
    endm
 
keytab  db  128 dup(0) ; таблица нажатых клавиш
kbd_set dw      0          ; флаг клавиатурный обработчик установлен
old9    label   dword      ; исходное прерывание клавиатуры
old9ip  dw  0
old9cs  dw  0
new9:   push ax ; новое прерывание клавиатуры
    push bx
    push cx
wt:     delay
    in      al,60H
        cmp     al,255
        jz      wt
;; Нажата клавиша Break ? Восстанавливаем прерывание и выходим (чтобы можно было прервать программу в QB)
;; ^    Restore Kbd interrupt on Break key - debug version only
IF KDEBUG
    cmp al,0E1h ; Break
    jnz kb1
    call    ResetVect
    pop     cx
    pop     bx
    pop     ax
    jmp dword ptr cs:old9
ENDIF
; код по мотивам Dan Rolling's Tech Help int 9
; delay добавлен для улучшения стабильности - не знаю нужно ли
kb1:    push    ax
    mov     cx,1
    delay
    in      al,61H
    delay
    mov     ah,al
    or      al,80h
    out     61H,al
    delay
    xchg    ah,al
    out     61H,al
    delay
    mov     al,20H
    out     20H,al
    delay
    pop     ax
; просто игнорировать код E0 или больше
    cmp al,0E0h
    jnc kb0
; установить в таблице байт в -1, если клавиша нажата (test al,80h = 0) или в 0 - если отпущена
    mov bl,al
    mov bh,0
    and bl,7Fh
    add bx,offset keytab
    mov byte ptr cs:[bx],-1
    test al,80h
    jz kb0
    mov byte ptr cs:[bx],0
kb0:    pop cx
    pop bx
    pop ax
    iret ; стандартная обработка INT 9 не вызывается
 
 
ResetVect: cmp kbd_set,0 ; если установлен новый обработчик, то восстановить старый
       jz  rv1
       push ds
       mov  ax,0
       mov  ds,ax
       mov  ax,old9ip
       mov  ds:[4*9],ax
       mov  ax,old9cs
       mov  ds:[4*9+2],ax
       pop  ds
       mov kbd_set,0
rv1:       ret
 
SetVect: cmp kbd_set,0 ; если НЕ установлен новый обработчик, то очистить keytab и установить новый
       jnz  sv01
       push es
       push cs
       pop  es
       mov  ax,0
       mov  di,offset keytab
       cld
       mov  cx,40h
       rep stosw
       pop  es
       push ds
       mov  ax,0
       mov  ds,ax
       mov  ax,ds:[4*9]
       mov  old9ip,ax
       mov  ax,ds:[4*9+2]
       mov  old9cs,ax
       mov  ax,offset new9
       mov  ds:[4*9],ax
       mov  ax,cs
       mov  ds:[4*9+2],ax
       pop  ds
       mov kbd_set,-1
sv01:      ret
 
; Возврат флага нажата-отпущена
keystatus: cmp al,070h ; al>=70h - таких скан-кодов не бывает
       jnc ks1
       cmp al,0    ; al=0 - такого скан-кода тоже нет
       jz  ks1
       mov bx,offset keytab ; ax=0 - отпущена, ax=-1 - нажата
       mov ah,0
       add bx,ax
       mov al,cs:[bx]
       cmp al,0
       jz  ks1
       mov ax,-1
       ret
ks1:       mov ax,0
       ret
 
; библиотечные функции для вызова из QB
; установка нового прерывания, если аргумент kflag<>0 или восстановление, если аргумент=0
 
     PUBLIC _SETKBD
kflag    EQU    word  ptr [bp+ 4+FARC]
 
_SETKBD  PROC FAR
      push    bp
      mov     bp,sp
      sub     sp,20
      push    si
      push    di
      push    ds
          push    es
      cmp     kflag,0
      jz      sk0
sk1:      call    setvect
      jmp     sk2
sk0:      call    resetvect
sk2:      pop     es
      pop     ds
          pop     di
          pop     si
          mov     sp,bp
          pop     bp
      ret
_SETKBD  ENDP
 
; Нажата ли клавиша со скан-кодом key. Возвращает -1, если клавиша нажата и 0, если отпущена
 
     PUBLIC _KEYS
key  EQU    word  ptr [bp+ 4+FARC]
 
_KEYS     PROC FAR
      push    bp
      mov     bp,sp
      sub     sp,20
      push    si
      push    di
      push    ds
          push    es
      mov     ax,0
      cmp     kbd_set,0
      jz      k1
      mov     ax,key
      call    keystatus
k1:   pop     es
      pop     ds
          pop     di
          pop     si
          mov     sp,bp
          pop     bp
      ret
_KEYS     ENDP
0
Прощай, Мир!
 Аватар для proc3nt
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
16.03.2021, 19:47  [ТС]
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
достаточно значения из BDA [0000:046C]
ФедосеевПавел, где об этом можно подробнее почитать?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4491 / 1669
Регистрация: 01.02.2015
Сообщений: 13,899
Записей в блоге: 12
16.03.2021, 19:52
Это про системный таймер таймер (int 08h и int 1Ch) - увеличивают на 1 число dword с адреса [0000:046C].

Прочитать об этом можно, наверное, у того же Кулакова, и в каких-нибудь книгах по ассемблеру, может быть у Зубкова, может быть где-то у Фролова.
http://www.techhelpmanual.com/... ables.html
1
Прощай, Мир!
 Аватар для proc3nt
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
16.03.2021, 20:34  [ТС]
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Может быть перехватывать таймер и нет необходимости
ФедосеевПавел,
оказалось, что перехватывать таймер вообще не нужно..
s - левая точка, k - правая точка (временно)
вроде так неплохо работает обоюдное движение..
Assembler
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
; модель памяти
.MODEL SMALL            
 
.DATA
LEFT_X DW 10     
LEFT_Y DW 10     
 
RIGHT_X DW 304   
RIGHT_Y DW 10    
 
OLD_HANDLER LABEL DWORD
OLD_HANDLER_OFF DW ?
OLD_HANDLER_SEG DW ?
 
KEY_FLAG DB 0
 
.STACK 100h
 
.CODE
; точка входа в программу
start:
    ; инициализация сегмента данных
    mov ax,@data
    mov ds,ax
    
    ; установить графический режим 320x200 пикселей
    mov ax, 13h
    int 10h
 
    push es
    
    xor ax, ax
    mov es, ax
 
    ; сохранить стандартный обработчик прерывания клавиатуры
    mov ax, word ptr es:[09h*4]
    mov word ptr [OLD_HANDLER_OFF], ax
    mov ax, word ptr es:[09h*4+2]
    mov word ptr [OLD_HANDLER_SEG], ax
 
    cli
    ; установить пользовательский обработчик прерывания клавиатуры
    mov ax, cs
    mov word ptr es:[09h*4+2], ax
    mov ax, offset KeyPress
    mov word ptr es:[09h*4], ax
    sti
 
    pop es
    
    ; первоначальное рисование левой точки
    call DrawLeft
    ; первоначальное рисование правой точки
    call DrawRight
    
    ; выбор действия
    NextStep:
    ; проверка обоюдного нажатия клавиш
    cmp KEY_FLAG,10000001b
    jz BothDown
    
    ; проверка флага левой клавиши
    test KEY_FLAG,10000000b
    jnz LeftDown
    
    ; проверка флага правой клавиши
    test KEY_FLAG,00000001b
    jnz RightDown
    
    jmp NextStep
    
    BothDown:
    ; стереть левую точку
    call ClearLeft
    ; стереть правую точку
    call ClearRight
    ; изменить координату левой точки
    call MoveLeft
    ; изменить координату правой точки
    call MoveRight
    ; нарисовать левую точку
    call DrawLeft
    ; нарисовать правую точку
    call DrawRight
    
    jmp SomeDelay
 
    LeftDown:
    ; стереть левую точку
    call ClearLeft
    ; изменить координату левой точки
    call MoveLeft
    ; нарисовать левую точку
    call DrawLeft
 
    jmp SomeDelay
 
    RightDown:
    ; стереть правую точку
    call ClearRight
    ; изменить координату правой точки
    call MoveRight
    ; нарисовать правую точку
    call DrawRight
 
    SomeDelay:
    mov cx,10000
    OuterBox:
        push cx
        
        mov cx,10000
        InnerBox:
            nop
        loop InnerBox
        
        pop cx
    loop OuterBox
    
    jmp NextStep
    
    ExitProg:
    ; выход из программы
    mov ah,4Ch              
    mov al,0
    int 21h
 
; стереть левую точку
proc ClearLeft
    mov cx, [LEFT_X]    
    mov dx, [LEFT_Y]
    
    mov ah, 0Ch                 
    mov al, 0                   
    mov bh, 0                   
    int 10h                     
        
    ret 
endp ClearLeft
 
; стереть правую точку
proc ClearRight
    mov cx, [RIGHT_X]    
    mov dx, [RIGHT_Y]    
    
    mov ah, 0Ch                 
    mov al, 0                   
    mov bh, 0                   
    int 10h
 
    ret
endp ClearRight
 
; нарисовать левую точку
proc DrawLeft
    mov cx, [LEFT_X]    
    mov dx, [LEFT_Y]   
    
    mov ah, 0Ch                 
    mov al, 0Fh                  
    mov bh, 0                   
    int 10h                     
        
    ret
endp DrawLeft
 
; нарисовать правую точку
proc DrawRight
    mov cx, [RIGHT_X]   
    mov dx, [RIGHT_Y]    
        
    mov ah, 0Ch                 
    mov al, 0Fh                 
    mov bh, 0               
    int 10h                     
 
    ret
endp DrawRight
 
; изменить координату левой точки
proc MoveLeft
    cmp [LEFT_Y], 199
    je FinLeftMove
 
    add [LEFT_Y], 1
    
    FinLeftMove:
    ret
endp MoveLeft
 
; изменить координату правой точки
proc MoveRight
    cmp [RIGHT_Y], 199
    je FinRightMove
 
    add [RIGHT_Y], 1            
    
    FinRightMove:
    ret
endp MoveRight
 
; пользовательский обработчик прерывания клавиатуры
KeyPress proc
    ; запретить прерывания
    cli
 
    ; получить скан код клашиши из порта
    in al,60h
        
    ; проверка нажатия клавиши 's'
    cmp al,1Fh
    je SetLeft
    
    ; проверка отпускания клавиши 's'
    cmp al,9Fh
    je ClrLeft
 
    ; проверка нажатия клавиши 'k'
    cmp al,25h 
    je SetRight
    
    ; проверка отпускания клавиши 'k'
    cmp al,0A5h 
    je ClrRight
    
    jmp FinCheck
    
    SetLeft:
    ; установить левый флаг
    or KEY_FLAG,10000000b
    
    jmp FinCheck
    
    ClrLeft:
    ; сбросить левый флаг
    and KEY_FLAG,01111111b
    
    jmp FinCheck
    
    SetRight:
    ; установить правый флаг
    or KEY_FLAG,00000001b
    
    jmp FinCheck
    
    ClrRight:
    ; сбросить правый флаг
    and KEY_FLAG,11111110b
    
    FinCheck:
    ; разрешить прерывания с более низким приоритетом
    mov al,20h  ; команда EOI
    out 20h,al
    
    ; разрешить прерывания
    sti
    
    ; возврат из пользовательского обработчика прерывания
    iret
KeyPress endp
; конец программы с указанием точки входа
end start
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.03.2021, 20:34
Помогаю со студенческими работами здесь

Одновременное нажатие 2х клавиш
ПРивет всем, я только знакомлюсь с AS3 и столкнулся с проблемой, которую не могу решить уже несколько дней. Я пытаюсь отследить...

Одновременное нажатие клавиш
&lt;html&gt; &lt;head&gt; &lt;body&gt; &lt;script&gt; function runOnKeys(func) { var codes = .slice.call(arguments, 1); var pressed =...

Одновременное нажатие клавиш
Здравствуйте. Столкнулся с проблемой. Кнопки на форме связаны с клавишами клавиатуры. Необходимо что бы при нажатии на 3 кнопки...

Одновременное нажатие клавиш
Доброго времени суток. У меня такой вопрос - возможно ли как - то обрабатывать событие происходящее при одновременном нажатии 2 и более...

Одновременное нажатие клавиш
Приветствую. В общем, суть проблемы такова: Играю в Gta San Andreas через мультиплеер SAMP. При быстром беге персонаж не поворачивает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru