Форум 3DNews

Форум 3DNews (http://forum.3dnews.ru/index.php)
-   Программирование (http://forum.3dnews.ru/forumdisplay.php?f=44)
-   -   циклическое переключение индикаторов клавиатуры в Ассемблере (http://forum.3dnews.ru/showthread.php?t=60847)

солнышко 22.06.2006 10:39

циклическое переключение индикаторов клавиатуры в Ассемблере
 
Здравствуйте, пожалуйста помогите с задачей=) Программа ы формате com ? осуществляющая циклическое переключение индикаторов клавиатуры(Caps Lock и еще два) используя упрощенные директивы сегментации. Для передачи кодов параметров используется входной буфер с адресом 60h, для пересылке команд клавиатуре EDh. И данна была таблица 8 7 6 5 4 3 2 1 0 резерв CL NL SL CL 0-выкл 1- вкл NL 0 выкл 1 вкл. SL 0 выкл 1 вкл 7-3 должны быть установлены на 0
Заранее благодарю!
(ОС WINDOWS XP,TASM)

1101 22.06.2006 13:58

Jesi, иди на http://www.wasm.ru/forum/ там была примерно такая тема с листингом на MASM'е

Sanya 28.06.2006 15:58

солнышко
Код:

//*********************************************************************
// мигание индикаторов
// команда 0xED выдается не контроллеру, а самой клавиатуре,
// поэтому пишем ее в порт 0х60
// Состояние индикаторов определяется следующим байтом,
//  0-й бит == состояние Scroll Lock
//  1-й бит == Caps Lock
//  2-й бит == Num Lock
// Бит ==1 -> зажечь светодиод, Бит == 0 -> погасить светодиод
// Для комбинирования светодиодов юзаются битовые маски
// (если записать "3", то включатся Scroll и Caps, а Num погаснет)
//    0 == 000 (все погашены)
//    1 == 001 (Scroll)
//    2 == 010 (Caps)
//    3 == 011 (Scroll + Caps)
//    4 == 100 (Num)
//    5 == 101 (Num + Scroll)
//    6 == 110 (Num + Caps)
//    7 == 111 (все включены)
// Старшие биты (начиная с 3-го) игнорируются.
// Если определить 1 == SCROLL_LOCK, 2 == CAPS_LOCK, 4 == NUM_LOCK,
// то значения получаются установкой битов:
//    зажечь Num и Scroll:  NUM_LOCK | SCROLL_LOCK (5 == 4 + 1)
// сложение чисел заменяется установкой битов побитовым "или"

    static short int i=1;  // вообще-то должно быть char...
    asm{
        mov al, 0xED
        out 0x60, al
        mov ax, i  // i занимает 2 байта, поэтому ax
        out 0x60, al  // ah нас не интересует
        nop
        nop
        nop
    }
    if(i==1) i=2;
    else if(i==2) i=4;
    else i=1;
//*********************************************************************

тут, правда, вперемешку с Сишным кодом, но в целом проблем не возникнет :)
по таймеру (или как больше нравится) вызываешь этот код -- и будет тебе счастье.
Переменная i -- статическая, в АСМ сделай ее глобальной.


Текущее время: 20:17. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot