С клавой напрямую..

Тема в разделе "WASM.OS.DEVEL", создана пользователем phobos__, 17 май 2010.

  1. phobos__

    phobos__ New Member

    Публикаций:
    0
    Регистрация:
    11 май 2010
    Сообщения:
    16
    Товарищи!тут прогу пишу, работающая напрямую через порты ввода/вывода с клавой и на одном моменте
    совсем застопорился- теоретически вроде все понятн и читал много всякой доки, а прогр так и не пашет:
    вылетает на вводе последнего символа.
    Мож кто смекнет че здесь не так:
    use16
    vvod:
    xor dx,dx
    WaitLoop:
    in al,64h
    test al,1
    jz WaitLoop ; Wait for IBF = 1
    in al, 60h ; Read input buffer
    cmp al,0Bh
    jne ne_nol ;спец для 0 -чтобы его в ASCII перевести
    sub al,0Ah
    ne_nol: ;перевод в ASCII
    add al,2Fh
    cmp al,30h
    jl WaitLoop ;чтобы не обрабатывать отжатие
    inc edi
    mov [VIDEO_RAM+edi*2],al ;копирование в видеопамять
    cmp dx,3
    je nakonec ;надо 4 символа получить
    inc dx
    jmp WaitLoop
    nakonec:
    ..........код..........
     
  2. airyashov

    airyashov New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2008
    Сообщения:
    12
    это в каком контексте исполняется без ОС? прерывания отключены?
     
  3. Ykidia

    Ykidia Member

    Публикаций:
    0
    Регистрация:
    21 июн 2005
    Сообщения:
    99
    Адрес:
    Санкт-Петербург
    Подобный код очень сильно зависит от того, где он запущен, в частности, это host OS и hardware. Например, если запущен из-под NTVDM, то бит 0 порта 64h не везде транслируется в NTVDM. Т.е. ядро win считывает код, и бит этот сбрасывается, т.о. события нажатия/отпускания клавиши можно и не получить вообще. О наличии каких-либо событий от клавиатуры приходится выяснять косвенными путями, к примеру, нажатие клавиш отлавливать функциями BIOS, а отпускание - изменением значения порта 60h. Но тут другая проблема - если прочитать порт 60h в то время, как в порту 64h был установлен бит 5 (т.е. событие от PS/2 мыши, а не клавиатуры), в host OS может заколдобиться дальнейшая работа с мышью, вплоть до перезагрузки.
    В чистом DOS с не-USB клавой приведенный код должен работать, но для этого желательно запретить обработчик int 9, чтобы он при прерывании от клавы не читал порт 60h и таким образом не сбрасывал бит 0 порта 64h. Все понятно?
     
  4. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine