Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2016, 15:37   #1
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию Отображение кодов нажимания / отпускания клавиши

Задание:
Реализовать процедуру обработки прерывания от клавиатуры, что заменяет стандартный обработчик. Процедура должна реализовать отображение кодов нажимания / отпускания клавиши.
Нашел код который выводит скан код нажатой клавиши, как его модифицировать что бы выводило так же код отпускания клавиши?
Код:
Код:
model   tiny
; Труппоасм не понимает AAM c основанием счисления - пишем макро
.aam    macro   power
    db  0D4h, power
    endm
.code
    org 100h
start:  xor ah, ah
    int 16h
    cmp ah, 1   ; <Esc>?
    jz  done
    int 29h
    mov al, 20h
    int 29h
    mov al, ah
    call    cvt
    call    crlf
    jmp start
done:   int 20h
cvt:    .aam     16              ; al / 16 -> ah - десятки, al - единицы
    or  ax, 3030h       ; преобразуем в символы ASCII
    call    @0              ; десятки  выводим первыми
@0: xchg    al, ah          ; меняем местами 
    cmp al, 39h         ; если код символа 
    jbe @1              ; больше '9'?
    add al, 7           ; то корректируем его до 'A'-'F'
@1: int 29h         ; выводим на экран
    ret
crlf:   mov ax, 0D0Ah
    int 29h
    xchg    ah,al
    int 29h
    ret
    end start
Max00766 вне форума Ответить с цитированием
Старый 20.05.2016, 16:57   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Википедия: https://ru.m.wikipedia.org/wiki/Скан-код
Цитата:
При нажатии любой клавиши контроллер клавиатуры распознаёт клавишу и посылает её скан-код в порт 60h. При отпускании клавиши контроллер клавиатуры устаревшего формата(XT) посылает в тот же порт скан-код, увеличенный на 80h, а более нового формата(AT) — два байта: F0h и скан-код.
Коды отпускания всех клавиш приведены в таблице по-ссылке.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 21.05.2016, 12:07   #3
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
Википедия: https://ru.m.wikipedia.org/wiki/Скан-код


Коды отпускания всех клавиш приведены в таблице по-ссылке.
А как в коде сделать что бы выводило скан код отпускания клавиши, я понимаю что надо просто приплюсовать 80h к скан коду нажимания клавиши, но как это сделать не знаю, так как в ассемблере очень плохо разбираюсь?
Max00766 вне форума Ответить с цитированием
Старый 21.05.2016, 14:29   #4
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Max00766 Посмотреть сообщение
понимаю что надо просто приплюсовать 80h
А чё, у тебя машина древняя XT что-ли?
Сказано-же, что для АТ - контроллёр посылает в порт 60h 2 байта: F0 и скан.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 21.05.2016, 14:46   #5
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
А чё, у тебя машина древняя XT что-ли?
Сказано-же, что для АТ - контроллёр посылает в порт 60h 2 байта: F0 и скан.
То-есть до кода дописывать ничего не надо?
Max00766 вне форума Ответить с цитированием
Старый 21.05.2016, 14:56   #6
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Нет, не надо. Просто добавляй F0 и всё. Это во-первых..
Во-вторых, ты выводишь scan-код в 10-тичном виде через AAM. Такой финт водит только двузначное/десятичное число. А если скан будет у тебя =100d, тогда что? Поэтому выводить нужно в HEX (как он и валяется в буфере). Короче вот тебе вариант:

Код:
org  100h
jmp  start

mess0   db   13,10,10,' Symbol: $'
mess1   db   13,10,' ---------------'
        db   13,10,' Press..: $'
mess2   db   13,10,' UnPress: $'

start: mov   dx,mess0        ;
       call  message         ;
       xor   ax,ax           ; читаем ASCII и SCAN
       int   16h             ;
       cmp   al,13           ; на выход, если Enter
       je    exit            ;
       int   29h             ; выводим ASC на экран
       xchg  ah,al           ; отправляем SCAN в ASC
       xor   ah,ah           ; очищаем ASC
       push  ax ax ax        ; запиминаем SCAN
       mov   dx,mess1        ;
       call  message         ;
       pop   ax              ;
       call  outHex          ; выводим SCAN нажатия
       mov   dx,mess2        ;
       call  message         ;
       mov   ax,'F0'         ; вставляем F0h
       int   29h             ;
       shr   ax,8            ;
       int   29h             ;
       mov   al,','          ; разделитель
       int   29h             ;
       pop   ax              ;
       call  outHex          ; выводим прицепом SCAN
       jmp   start           ; сл.символ..

exit:  int   20h             ;
;------------------------------------------------

message:                     ;
       mov   ah,9            ;
       int   21h             ;
       ret                   ;

outHex:                      ; процедура выводит на экран АХ в HEX
       shl   ax,8            ; AH нам не нужен. Сдвинем в него AL
       xchg  dx,ax           ;
       mov   cx,2            ; разрядов в числе
@1:    shld  ax,dx,4         ;
       rol   dx,4            ;
       and   al,0Fh          ;
       cmp   al,0Ah          ;
       sbb   al,69h          ;
       das                   ;
       int   29h             ;
       loop  @1              ;
       ret                   ;
Изображения
Тип файла: jpg scan.JPG (16.6 Кб, 60 просмотров)
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 21.05.2016, 15:52   #7
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
Нет, не надо. Просто добавляй F0 и всё. Это во-первых..
Во-вторых, ты выводишь scan-код в 10-тичном виде через AAM. Такой финт водит только двузначное/десятичное число. А если скан будет у тебя =100d, тогда что? Поэтому выводить нужно в HEX (как он и валяется в буфере). Короче вот тебе вариант:

Код:
org  100h
jmp  start

mess0   db   13,10,10,' Symbol: $'
mess1   db   13,10,' ---------------'
        db   13,10,' Press..: $'
mess2   db   13,10,' UnPress: $'

start: mov   dx,mess0        ;
       call  message         ;
       xor   ax,ax           ; читаем ASCII и SCAN
       int   16h             ;
       cmp   al,13           ; на выход, если Enter
       je    exit            ;
       int   29h             ; выводим ASC на экран
       xchg  ah,al           ; отправляем SCAN в ASC
       xor   ah,ah           ; очищаем ASC
       push  ax ax ax        ; запиминаем SCAN
       mov   dx,mess1        ;
       call  message         ;
       pop   ax              ;
       call  outHex          ; выводим SCAN нажатия
       mov   dx,mess2        ;
       call  message         ;
       mov   ax,'F0'         ; вставляем F0h
       int   29h             ;
       shr   ax,8            ;
       int   29h             ;
       mov   al,','          ; разделитель
       int   29h             ;
       pop   ax              ;
       call  outHex          ; выводим прицепом SCAN
       jmp   start           ; сл.символ..

exit:  int   20h             ;
;------------------------------------------------

message:                     ;
       mov   ah,9            ;
       int   21h             ;
       ret                   ;

outHex:                      ; процедура выводит на экран АХ в HEX
       shl   ax,8            ; AH нам не нужен. Сдвинем в него AL
       xchg  dx,ax           ;
       mov   cx,2            ; разрядов в числе
@1:    shld  ax,dx,4         ;
       rol   dx,4            ;
       and   al,0Fh          ;
       cmp   al,0Ah          ;
       sbb   al,69h          ;
       das                   ;
       int   29h             ;
       loop  @1              ;
       ret                   ;
Спасибо большое, все работает, только когда нажимаю enter dos-box зависает, переделал код под tasm, может где-то ошибся?
Код:
.model small            ;модель памяти              
.386      

.data 
mess0   db   13,10,10,' Symbol: $'
mess1   db   13,10,' ---------------'
        db   13,10,' Press..: $'
mess2   db   13,10,' UnPress: $'


.stack                  ;сегмент стека      
    db  256 dup(?)      ;выделение памяти под стек
	
	
.code  
start: mov ax,@data        
	   mov ds,ax
	   lea   dx,mess0        ;
       call  message         ;
       xor   ax,ax           ; читаем ASCII и SCAN
       int   16h             ;
       cmp   al,13           ; на выход, если Enter
       je    exit            ;
       int   29h             ; выводим ASC на экран
       xchg  ah,al           ; отправляем SCAN в ASC
       xor   ah,ah           ; очищаем ASC
       push  ax ax ax        ; запиминаем SCAN
       lea   dx,mess1        ;
       call  message         ;
       pop   ax              ;
       call  outHex          ; выводим SCAN нажатия
       lea   dx,mess2        ;
       call  message         ;
       mov   ax,'F0'         ; вставляем F0h
       int   29h             ;
       shr   ax,8            ;
       int   29h             ;
       mov   al,','          ; разделитель
       int   29h             ;
       pop   ax              ;
       call  outHex          ; выводим прицепом SCAN
       jmp   start           ; сл.символ..

exit:  int   20h             ;
;------------------------------------------------

message:                     ;
       mov   ah,9            ;
       int   21h             ;
       ret                   ;

outHex:                      ; процедура выводит на экран АХ в HEX
       shl   ax,8            ; AH нам не нужен. Сдвинем в него AL
       xchg  dx,ax           ;
       mov   cx,2            ; разрядов в числе
@1:    shld  ax,dx,4         ;
       rol   dx,4            ;
       and   al,0Fh          ;
       cmp   al,0Ah          ;
       sbb   al,69h          ;
       das                   ;
       int   29h             ;
       loop  @1              ;
       ret                   ;
	   end start
Max00766 вне форума Ответить с цитированием
Старый 21.05.2016, 15:56   #8
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Код:
exit:  mov  ax,4c00h
       int  21h
..и не цитируй полностью мессаги, каша получается
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 21.05.2016, 16:00   #9
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
Код:
exit:  mov  ax,4c00h
       int  21h
..и не цитируй полностью мессаги, каша получается
Все работает, спасибо огромное, как только смогу добавлю отзыв Вам. Наверное, если бы не Вы ничего по ассемблеру не сдал бы)
Max00766 вне форума Ответить с цитированием
Старый 21.05.2016, 17:03   #10
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
..и не цитируй полностью мессаги
..
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Конфликт кодов Trimbl Microsoft Office Excel 6 23.06.2012 02:28
событие отпускания левой кнопки мыши для button Niyaz.cpp Visual C++ 0 24.04.2012 01:22
Конфликт кодов Brucebelg Microsoft Office Excel 3 10.02.2012 12:20
написать ASSEMBLER программу отображаущую скан-код нажатия и отпускания клавиш NAC35 Помощь студентам 2 16.06.2009 00:24