Работа с клавиатурой и мышью через BIOS

Тема в разделе "WASM.ASSEMBLER", создана пользователем Ykidia, 29 ноя 2008.

  1. Ykidia

    Ykidia Member

    Публикаций:
    0
    Регистрация:
    21 июн 2005
    Сообщения:
    99
    Адрес:
    Санкт-Петербург
    Всем привет!

    Требуется отлавливать нажатие/отпускание кнопок клавиатуры. При этом желательно отслеживать положение мыши и состояния ее кнопок.
    И все бы хорошо, пока клава/мышь - PS/2. Есть отличные порты 60h/64h (правда я не уверен, что они присутствуют во всех машинах с PS/2), через которые можно получить почти все, что нужно.
    Но тут пришел USB. Пользователю стало в чем-то удобнее, а программисту - "не очень". Иногда устройства USB работают в паре с клавиатурным контроллером, иногда нет. В некоторых BIOS есть опция что-то вроде Emulate ports 60/64, но не во всех. Лезть в дебри USB не хотелось бы...
    Однако сами функции BIOS достаточно в курсе насчет USB и вообще того, что воткнуто в компьютер (в современных материнках вообще начали потихоньку "забивать" на PS/2 и не выводить эти разъёмы!). Так или иначе функции int 16h позволяют узнать, какие кнопки на клавиатуре нажали. А как узнать, какие отпустили? Предположение об отпускании, опираясь на отсутствие автоповтора, не предлагать.
    Далее мышь. При запуске программы из-под NTVDM находится мышиный драйвер (int 33h), вроде все здорово инициализируется... но никакие мышиные события в драйвер через NTVDM не передаются. Чем пользоваться и как?

    Да, чуть не забыл. Если среда - NTVDM, а в системе установлен GiveIO или подобный, тогда прерывания наверяка перестанут работать при переключении видеорежима. Посему вариант с перехватом прерываний, к сожалению, отпадает.

    Есть идеи? Спасибо.
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Ykidia
    Используй порты PS/2. А если хочешь большей совместимости то сервисы ОС. BIOS он только для старта ОС предназначин. И много-го неумеет.

    Не понял что за бред!!! Как это все взаимо связано?

    Используй драйвер майкософт. Он сам тебе все подсунит что нужно. А если ты его используешь то ищи код у себя. NTVDM не все эмулирует.
    Если уж хочешь писать драйвера, то милости просим в дос. Или в ядро виндовс.

    В любом случии не понятно зачем вам это? Дос канул в лето очень давно. Для написания программ есть виндовс и линукс. Дос нужен если только для эксперементов с железом. А эксперементировать в NTVDM смысла нет.
     
  3. Ykidia

    Ykidia Member

    Публикаций:
    0
    Регистрация:
    21 июн 2005
    Сообщения:
    99
    Адрес:
    Санкт-Петербург
    Спасибо за ответ. Дело в том, что NTVDM я привел для примера. В общем-то, совместимость с ним желательна, но не обязательна.
    Здесь (ближе к концу) раскрыта тема проблем с прерываниями в NTVDM. Я ее более или менее обошел, кое-что приобрел от этого, но и кое-что потерял. Так или иначе, сейчас я работаю без прерываний.
    Но меня беспокоит, например, ввод с клавиатуры пользователем. Может понадобиться другая раскладка. Если работать с клавиатурой в обход ОС, то всего не предусмотришь.
    Каким образом? Возможно ли их использование через int 2Eh? Я так понял, что через int 2Eh возможно почти все (за исключением Windows Server 2003 SP1+). К сожалению, информацию об этом найти нелегко. Если мало ли есть какая-нибудь ссылка или прочая информация - поделитесь, пожалуйста, коли не жалко. Можно в ПМ.
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Ykidia
    Чудесно, лучше заюзать опрос в цикле и подвесить систему :lol: ))
    Pavia имел ввиду не системные сервисы а сервисы системы(не пойми меня не правильно) %).
    Гугль.
     
  5. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Clerk
    Я имел ввиду, то что надо писать виндовс приложения.

    Ykidia
    У меня в системе был установлен GiveIO и NTVDM работал корректно. Хотя не исключаю проблем.
    Поповоду int 2eh MSDN читать надо.

    Поповоду совместимости, делай так что бы работало хотябы где-то. А где не работает доработаешь потом.
     
  6. Ykidia

    Ykidia Member

    Публикаций:
    0
    Регистрация:
    21 июн 2005
    Сообщения:
    99
    Адрес:
    Санкт-Петербург
    Pavia
    Там проблемы проявляются не сразу.
    Какая неожиданность. Пошел смотреть.
     
  7. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    вопще ппц, ну что за детский бред?

    NTVDM в контексте аппаратно-програмного "какбы эмулятора", _вещь_ вполне себе даже ничего, по удобству использования.

    Лутше придерживаться совместимости.

    Насчет прерываний, главное работать по правилам - через интерфейс DOS/DPMI, и можешь ловить хоть исключения.

    Драйвер типа GiveIO, да, обеспечит доступ к реальному железу, хотя единственная некоректная весч в нем разрешение доступа ко всем портам, поэтому обработчик прерывания делающий out $20, $20 просто повиснит на iret.

    Так што тут лутше подоректировоть дров с более корректной настройкой.

    Но для начала надо провереть как пашут DOS проги в NTVDM, на системе с USB мышами и клавами. На боле менее правильных конфигурациях, должны корректно работать 16 битный Volcov Commander, из 32-битных DOOM2.
    зы
    ага.. так тебе и расписали про все номера сисколов :-D и что они делают
     
  8. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    Ykidia ну вот, как раз на последних страницах, по ссылке на ixbt, как одно из решений предлагаеться установка GiveIO в котором пофиксен трабл с NTVDM путем запрещения доступа в PIC0/PIC1
    Код (Text):
    1.         call    Ke386QueryIoAccessMap
    2.         movzx eax, al
    3.         test    eax, eax
    4.         jl  loc_10390
    5.         push    ebx
    6.         xor edx, edx
    7.         push    esi
    8.  
    9. loc_102F1:              ; CODE XREF: sub_102D2+9Aj
    10.         cmp edx, 20h
    11.         jz  short loc_10365
    12.         cmp edx, 21h
    13.         jz  short loc_10365
    14.         cmp edx, 0A0h
    15.         jz  short loc_10365
    16.         cmp edx, 0A1h
    17.         jz  short loc_10365
    18.         mov eax, edx
    Ykidia, а вобще, было бы неплохо уточнить, где ты собралсо работать с клавиатурой и мышью через BIOS
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Код (Text):
    1. NTSTATUS
    2. Ke386CallBios (
    3.     IN ULONG BiosCommand,
    4.     IN OUT PCONTEXT BiosArguments
    5.     )
    6.  
    7. /*++
    8.  
    9. Routine Description:
    10.  
    11.     This function invokes specified ROM BIOS code by executing
    12.     "INT BiosCommand."  Before executing the BIOS code, this function
    13.     will setup VDM context, change stack pointer ...etc.  If for some reason
    14.     the operation fails, a status code will be returned.  Otherwise, this
    15.     function always returns success regardless of the result of the BIOS
    16.     call.
    17.  
    18.     N.B. This implementation relies on the fact that the direct
    19.          I/O access operations between apps are serialized by win user.
    20.  
    21. Arguments:
    22.  
    23.     BiosCommand - Supplies which ROM BIOS function to invoke.
    24.  
    25.     BiosArguments - Supplies a pointer to the context which will be used
    26.                     to invoke ROM BIOS.
    27.  
    28. Return Value:
    29.  
    30.     NTSTATUS code to specify the failure.
     
  10. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    хм.. Вообще, недавно и сам столкнулсо с проблемой мышы и клавы, в некорректно обрабатывающих? это дело ntvdm прогах.
    Причем практически на ровном месте. Но тут дело вот в чем.

    Имея проц, на борту которого APIC, установщек венды, это дело отдетектил и подсунул HAL.dll, соответственно с его поддержкой.

    Наряду с достоинствами этово ядра, есть один существенный недостаток - невозможность нармально отрабатывать перехаченые аппаратные прерывания (старым дедовским способом).

    Все попытки насадить HAL с подержкой старого доброго PICa приводило к висяку на этапе загрузки и инициализации ntoskrnl.

    Разумееться виновными оказались, приколисты из мелкософта, подложившие хитрую свинью в диелелку (halacpi) в виде опкода 0F30 (wrmsr), который вероятней всего (шутки ради?) и врубал APIC.

    Вобщем проблема благополучно решилась, заменой wrmsr (благо он там всего один) на nop'ы, и ядро на базе PIC-ов благополучно стартануло.

    Однако почему перестали, некоторые 16bit проги (под real/v86 режимы) (в том числе и пару моих) реагировать на клаву, непонятно, (32 битные вроде кое как работают).
     
  11. Ykidia

    Ykidia Member

    Публикаций:
    0
    Регистрация:
    21 июн 2005
    Сообщения:
    99
    Адрес:
    Санкт-Петербург
    bugaga
    Собрался работать в DOS-совместимой среде (fullscreen NTVDM, DOSBox, native DOS environment, etc.) под управлением DOS/32A. Вернее, уже работаю, основная среда отладки NTVDM, ибо DOSBox тормозной, а всего прочего нет под рукой (есть древняя машинка, но ее нужно выковыривать из "долгого угла").
     
  12. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    Ykidia ну в принципе особых причин по которым прерывания не хотели бы отдаваться, нету.

    А насчет новых железяк - поизмывался тут както над AMD64 (4000+ чтоль каойто)/2Gb Ram/GF79xx, относительно установки Win98 - главное было, чтоб установщик ms-dos устаканил.

    Предварительная часть к большому изумлению прошла довольно гладко. Сама Win9x стартануть не осилила (хз, видимо оперативы ей показалось слишком много).

    Вот.. а в собственно самом ms-dos'е, на этом монстре, затестил свой код под защищенку, компиляя все это дело также 32bit тулзами, часть из которых адаптирована под wdosx экстендер (tasm/delphi) и dmc-шный dosX32 (link).

    Ну так, полет вроде наманый (да и 2гига, окучил тупым перебором ячеек), особено с учетом того что основная часть разработки (со всей компиляцией естественно) ведётся в DOSBOX-е c 2-mb ram :)

    зы: хы.. неким оч загадочным образм.. у меня нарисовались пропавшие прерывания..
    (а где и с чем поизвращался - уже и не упомню, насчет USB разборки были - а то с ентим PIC-ом, висят у мене щас на 11-ом irq, и видяха и звучко и два "универсальных хост контроллера VIA USB". вот. и чет флеха не захотела определяцца пришлось небольшой пёрл-харбор устроить. эх)