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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2009, 19:33   #1
NooDle
 
Регистрация: 08.01.2009
Сообщений: 9
По умолчанию Упрощенный вариант драйвера клавиатуры.

Всем добрый вечер, у меня есть упрощённый вариант драйвера клавиатуры на ассемблере,который мы делали на лабах, к нему нужно дописать
1) При нажатии Shift, чтобы буквы печатались в верхнем регистре.
2) При нажатии на Caps Lock, было переключение с нижнего регистра на верхний и наоборот.
3) При нажатии Ctrl+Shift+x, можно было выйти из программы.

Помогите пожайлуста, а то уже облазил весь инет и переломал голову и ничего не выходит.
Код:
IDEAL
P386
MODEL MEDIUM

STACK 400

DATASEG
        PressCounter DW ?
        OldKbdIntOffset DW ?
        OldKbdIntSegment DW ?
        CharInputFlag DB 0
        ASCIICode DB 0
        label RusNorm byte
        
        DB 0,0,'1','2','3','4','5','6'
        DB '7','8','9','0','-','=',0,0
        DB 'й','ц','у','к','е','н','г'
        DB 'ш','щ','з','х','ъ',0,0
        DB 'ф','ы','в','а','п','р','о'
        DB 'л','д','ж','э','Ё',0,'\'
        DB 'я','ч','с','м','и','т','ь'
        DB 'б','ю','.',0,'*',0,' '

ENDS

CODESEG

PROC KeyboardDriver
        
        mov     AX, DGROUP
        mov     DS,AX
        mov     [PressCounter],0
        call    SetKeyboardInterrupt
@@NextChar:
        cmp     [CharInputFlag],0
        je      @@NextChar
        mov     [CharInputFlag],0
        mov     DL,[ASCIICode]
        mov     AH,2h
        int     21h
        inc     [PressCounter]
        cmp     [PressCounter],80
        jb      @@NextChar
        call    RestoreOldKeyboardInterrupt
        mov     AH,4Ch
        int     21h
ENDP KeyboardDriver

proc KeyboardInterrupt far
        pusha
        push    DS
        mov     AX,DGROUP
        mov     DS,AX
        in      AL,60h
        push    AX
        mov     AL,20h
        out     20h,AL
        pop     AX
        sti
        cmp     AL,39h
        ja      @@End
        xor     BX,BX
        mov     BL,AL
        add     BX, offset RusNorm
        mov     AL,[BX]
        cmp     AL,32
        jb      @@END
        mov     [ASCIICode],AL
        mov     [CharInputFlag],1
@@End:  pop     DS
        popa
        iret
endp KeyboardInterrupt

PROC SetKeyboardInterrupt NEAR
        pusha
        push    ES
        mov     AX,0
        mov     ES,AX
        mov     AX,[ES:9*4]
        mov     [OldKbdIntOffset],AX
        mov     ax,[ES:9*4+2]
        mov     [OldKbdIntSegment],AX
        cli
        mov     AX,offset KeyboardInterrupt
        mov     [ES:9*4],AX
        mov     AX,CS
        mov     [ES:9*4+2],AX
        sti
        pop     ES
        popa
        ret
ENDP SetKeyboardInterrupt

PROC RestoreOldKeyboardInterrupt NEAR
        pusha
        push    ES
        mov     AX,0
        mov     ES,AX
        cli
        mov     AX,[OldKbdIntOffset]
        mov     [ES:9*4],AX
        mov     AX,[OldKbdIntSegment]
        mov     [ES:9*4+2],AX
        sti
        pop     ES
        popa
        ret
ENDP RestoreOldKeyboardInterrupt


ENDS

END

Последний раз редактировалось rpy3uH; 08.01.2009 в 20:53.
NooDle вне форума Ответить с цитированием
Старый 09.01.2009, 12:49   #2
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Вот как то так. Конечно не очень элегантно, но тем не менее......
Вложения
Тип файла: rar proga13.rar (1.6 Кб, 100 просмотров)
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 09.01.2009, 20:42   #3
NooDle
 
Регистрация: 08.01.2009
Сообщений: 9
По умолчанию

Ulex, спасибо огромное. Даже не знаю как и благодарить, все отличноо работает, но почему-то, при нажатии Ctrl+Shift+x не выходит из программы.
NooDle вне форума Ответить с цитированием
Старый 10.01.2009, 01:59   #4
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Вы наверное не те кнопки жмёте. Учитывая, что ваша программка работает только с русскими буквами, я порешил что и в сочетании Ctrl+Shift+x - х - это русская буква х (ха), а не английская x (икс).
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 11.01.2009, 11:14   #5
NooDle
 
Регистрация: 08.01.2009
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Ulex Посмотреть сообщение
Вы наверное не те кнопки жмёте. Учитывая, что ваша программка работает только с русскими буквами, я порешил что и в сочетании Ctrl+Shift+x - х - это русская буква х (ха), а не английская x (икс).
Да, так оно и есть. Спасибо огромное.
NooDle вне форума Ответить с цитированием
Старый 13.01.2009, 12:32   #6
NooDle
 
Регистрация: 08.01.2009
Сообщений: 9
По умолчанию

Уважаемый, Ulex. Вы бы не могли написать комментарий к тем строкам, которые вы добавили, а то я не совсем понимаю принцип работы. Заранее благодарен.
NooDle вне форума Ответить с цитированием
Старый 13.01.2009, 16:10   #7
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Ну если только очень кратенько и не по сторокам, а по принципу.

1. завел одельный массив байт для больших букв

Код:
        label RusNormCaps byte
        
        DB 0,0,'1','2','3','4','5','6'
        DB '7','8','9','0','-','=',0,0
        DB 'Й','Ц','У','К','Е','Н','Г'
        DB 'Ш','Щ','З','Х','Ъ',0,0
        DB 'Ф','Ы','В','А','П','Р','О'
        DB 'Л','Д','Ж','Э','Ё',0,'\'
        DB 'Я','Ч','С','М','И','Т','Ь'
        DB 'Б','Ю','.',0,'*',0,' '
2. завёл флажки на нажатие кнопок Shift, Ctrl, CapsLock.

Код:
	ShiftPress DB 0
	CtrlPress DB 0
	CapsPress DB 0
3. по кодам нажатия/отпускания этих кнопок устанавливаются/снимаются соответствующие флажки

Код:
  cmp     AL,29
  jne      @@NotCtrl
  mov	[CtrlPress], 1
@@NotCtrl:
  cmp     AL,157
  jne      @@NotEscCtrl
  mov	[CtrlPress], 0
@@NotEscCtrl:
4. по состоянию флажков происходит выбор соответствующего массива (с маленькими или большими буковками)

Код:
  mov	dl, [CapsPress]
  xor	dl, [ShiftPress]
  cmp	dl, 1
  je	@@BigBuki
  add     BX, offset RusNorm
  jmp	@@SmallBuki
@@BigBuki:
  add     BX, offset RusNormCaps
@@SmallBuki:
  mov     AL,[BX]
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 09.03.2010, 17:32   #8
FUSKER
Новичок
Джуниор
 
Регистрация: 06.03.2010
Сообщений: 1
По умолчанию

Товарищи программисты, не могли бы вы объяснить(написать комменты) последние две процедуры исходной программы?
заранее благодарен
FUSKER вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Предложите свой вариант решения на (Си) @ARXANGEL@ Фриланс 7 10.11.2008 09:54
Драйвера в linux shtopor Операционные системы общие вопросы 1 03.06.2008 14:57
Ошибка драйвера Dimoney Общие вопросы Delphi 8 28.05.2008 11:26
Драйвера БД! Проблема! Abbatik Помощь студентам 3 28.01.2008 01:03
Сетевой вариант базы данных. A.Tulin БД в Delphi 7 18.06.2007 00:46