Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 24.05.2015
Сообщений: 48
1

Вывод скан кода нажатой клавиши

05.10.2020, 12:33. Показов 996. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Кликните здесь для просмотра всего текста

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
.286
CSEG segment
assume cs: CSEG, ds: CSEG, es: CSEG, ss: CSEG
org 100h
 
Snake:
    call Init
    Start_game:
        mov ax, Current_time
        cmp ax, Step_timer
        jb Start_game
        
        mov Current_time, 0
        mov al, Last_push_button
        cmp al, 1
        je Quit
        call Show
        
        jmp Start_game
        
    
    Show proc
        push 0B900h
        pop es
        mov ah, 31
        mov al, Last_push_button
        mov es:[di], ax
        inc di
        inc di
        
        ret
    Show endp
    
    Init proc
        mov ax, 3
        int 10h
        mov ah, 2                               ;Прячем курсор
        mov bh, 0
        mov dx, 2000h
        int 10h                                 ;///
        mov ax, 0501h                           ;Переключаемся на 2-ю видеостраницу
        int 10h
        
        push 0
        pop es
        mov ax, es:[9h * 4]                     ;Получаем оригинальный вектор int 9h
        mov Orig_Int9h_off, ax
        mov ax, es:[9h * 4 + 2]
        mov Orig_Int9h_seg, ax                  ;///        
        mov ax, es:[8h * 4]                 ;Получаем оригинальный вектор int 8h
        mov Orig_Int8h_off, ax
        mov ax, es:[8h * 4 + 2]
        mov Orig_Int8h_seg, ax                  ;///    
        
        cli                                     ;Устанавливаем своё прерывание на int 9h
        mov ax, offset My_Int9h_proc
        mov es:[9h * 4], ax
        mov es:[9h * 4 + 2], cs
        mov ax, offset My_Int8h_proc            ;Устанавливаем своё прерывание на int 8h
        mov es:[8h * 4], ax
        mov es:[8h * 4 + 2], cs
        sti                                     ;///
        
        ret
    Init endp
    
    My_Int9h_proc proc
        pushf
        call dword ptr cs:[Orig_Int9h_off]
        in al, 60h
        cmp al, 5Eh                             ;Только нажатая кнопка
        jb Go_next
        iret
        Go_next:
            mov Last_push_button, al
        iret
    My_Int9h_proc endp
    
    My_Int8h_proc proc
        pushf
        call dword ptr cs:[Orig_Int8h_off]
        inc Current_time
        
        iret
    My_Int8h_proc endp
    
    Quit:
        cli                                     ;Возвращаем оригинальное прерывание int 8h
        push 0
        pop es
        mov ax, Orig_Int8h_off
        mov es:[8h * 4], ax
        mov ax, Orig_Int8h_seg
        mov es:[8h *4 + 2], ax
        mov ax, Orig_Int9h_off                  ;Возвращаем оригинальное прерывание int 9h
        mov es:[9h * 4], ax
        mov ax, Orig_Int9h_seg
        mov es:[9h *4 + 2], ax
        sti
        
        mov ax, 3
        int 10h
        mov ax, 0500h                           ;Переключаемся на 1-ю видеостраницу
        int 10h
        int 20h
    
    Orig_Int9h_off dw ?
    Orig_Int9h_seg dw ?
    Orig_Int8h_off dw ?
    Orig_Int8h_seg dw ?
    Last_push_button db 4Dh
    Step_timer dw 18
    Current_time dw 0
    
    Pos_cursor dw 0
    
CSEG ends
end Snake


Здравствуйте. Помогите советом.
Хотел чтобы примерно раз в секунду выводился скан код последней нажатой клавиши (в виде ASCII символов).
Но вот беда.
1. Если нажимаю стрелки, то отображаютя сразу 3 символа ( звёздочка и дважны нажатая клавиша).
2. Если быстро нажимаю на клавиши, то они отображаются быстрее чем раз в секунду.
В чём у меня проблема?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.10.2020, 12:33
Ответы с готовыми решениями:

Обработка прерывания клавиатуры: замена скан-кода клавиши Del на Ins
Спасите прошу. Есть вот такая программа: Подмена клавиш 3. Замените клавишу Del на Ins. Напишите...

Вывод кода клавиши из буфера клавиатуры
Добрый вечер. Преподаватель дал задание написать курсовую. "Напишите программу обработки прерывания...

Вывод scan кода и ascii кода нажатой клавиши
Подскажите пожалуйста, как реализовать вывод scan кода и ascii кода нажатой клавиши в ассемблерной...

Ввод кода нажатой клавиши и вывод информации на индикацию
Здравствуйте,помогите пожалуйста написать программу: ввод кода нажатой клавиши и вывод информации...

1
0 / 0 / 0
Регистрация: 24.05.2015
Сообщений: 48
07.10.2020, 11:39  [ТС] 2
Частично проблема решилась заменой
Assembler
1
jb Start_game
на
Assembler
1
jne Start_game
.
Не пойму почему так, ведь "меньше" jb (прыгать если меньше), тоже самое что "не равно" jne (прыгать если не равно), и программа должна делать переход на метку "Start_game:" (17 раз из 18, примерно раз в секунду) (строки 8-11). Но она идёт дальше и выводит символ на экран.
0
07.10.2020, 11:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2020, 11:39
Помогаю со студенческими работами здесь

Как в программе определить СКАН- код и ASCII - код нажатой клавиши?
Ответьте пожалуйста на вопрос: как с помощю программы определить СКАН- код и ASCII - код нажатой...

Вывод сообщения в зависимости от нажатой клавиши
При вводе прописных латинских букв (в верхнем регистре) выдавать с новой строки на экран сообщение...

Вывод названия нажатой пользователем функциональной клавиши
У меня вопрос, дали задание в университете, нужно написать программу, которая будет выводить какую...

Вывод позиц Код символа нажатой клавиши
Задачи две: первая выводит позиц. Код символа нажатой клавиши.

[masm32] Реализовать сообщение WM_CHAR (вывод названия нажатой клавиши)
Здраствуйте,пишу на masm. Возник вопрос,как реализовать сообщение WM_CHAR,чтобы при нажатий на...

Вывод на дисплей одного из трех текстовых сообщений, в зависимости от нажатой клавиши.
Здравствуйте. Помогите пожалуйста выполнить задание по Assembler'у. Тема "Программирование внешних...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru