"Разгон" клавиатуры
Автор
10st
, Nov 12 2005 20:36
Сообщений в теме: 5
#1
Отправлено 12 November 2005 - 20:36
Как увеличить число одновременно нажимаемых клавиш на клавиатуре PS/2 программным способом (т.е. не прибегая к механическим инструментам)?
Это очень актуально в некоторых играх, особенно в эмуляторе приставки
(SEGA - Gens, например).
P.S. Интересно, это вообще возможно?
Это очень актуально в некоторых играх, особенно в эмуляторе приставки
(SEGA - Gens, например).
P.S. Интересно, это вообще возможно?
#2
Отправлено 13 November 2005 - 13:27
Сомневаюсь, что буфер клавиатуры можно увеличить программно...
#3
Отправлено 13 November 2005 - 14:03
с
#4
Отправлено 13 November 2005 - 18:12
10st!
Где-то такой вопрос уже слышал...
Где-то такой вопрос уже слышал...
Цитата |
keyboard.zip Профессиональная работа с клавиатурой (быстрый ввод, чтение флагов состояния клавиатуры, кодов и скан-кодов, клавиш, нажатых одновременно). Модули + примеры. http://alexfru.chat.ru/rindex.html |
На самом деле PS/2 клава или нет - не столь важно. Всё дело в организации буфера. Там по-моему ограничение на 14 символов - дальше переполнение. Вообще никто не мешает читать из буфера системного и записывать в какой-нибудь программный буфер. Я как-то занимался такой фигнёй - делаешь буфер под все клавиши клавиатуры, а затем, когда нажали какую-нибудь, делаешь что-то такое:
KeyBuffer[Key]:=1;
По умолчанию все клавиши = 0. После этого:
Key:=0
Зануление обычно означает, что ты перехватываешь клавишу и не даёшь ей попасть в клавиатурный буфер (я говорю сейчас о Delphi, под DOS'кой - придётся повозиться - вручную совмещать указатели на начало (голову) и на конец (хвост) клавиатурного буфера, тем самым устанавливая, что буфер - пуст). При отпускании клавиши - тоже генерится соответствующий код и ты тут же делаешь
KeyBuffer[Key]:=0;
И опять чистишь, на всякий пожарный, буфер:
Key:=0
В Delphi - это можно всё навешать на стандартные события OnKeyDown / OnKeyUp.
Для DOS всё маленько сложнее - тут нужно слушать Port[$60] и смотреть, что туда прилетело.
Програмный буфер там устроен так:
Адрес головы - Mem[$0040:$001A]
Адрес хвоста - Mem[$0040:$001C]
Mem[Seg:Ofs] - возвращает байт по указаному адресу памяти (Seg:Ofs).
MemW - -||- слово.
MemL - -||- двойное слово.
Учти - "хвост всегда догоняет голову". Т.е. Хвост и голова сначала указывают на одну позицию, затем, после нажатия клавиши, голова смещается, и между хвостом и ней засовывается код клавиши. При этом, когда из буфера будут читать, то голова будет торчать на месте, а хвост, после каждой считанной клавиши подтягиваться к ней. Буфер пуст, когда Mem[$0040:$001A] = Mem[$0040:$001C]. Ещё один прикол, на который можешь "напороться" - буфер кольцевой. Т.е. если у тебя голова и хвост торчали не на начале, то после того как в буфер начнут поступать новые нажатые клавиши и голова достигнет конца буфера, она "перескочет" на начало, где есть ещё пустые позиции. Это значит, что адрес головы - вовсе не обязательно больше адреса хвоста. Когда все 14 позиций буфера заполнены - компьютер издаёт характерный писк и ничего не делает.
Можно сделать что-то типа такого:
Цитата |
Procedure GetKeyCodes(Var I: Byte; Var J: Byte); Var B: Byte; Begin B:=Mem[$0040:$001A]; { Берём адрес головы - считаем, что до этого буфер у нас был пуст } I:=Mem[$0040:B]; { Обычный код - его возвращает ReadKey } J:=Mem[$0040:B+1]; { Скан код - его возвращяет Port[$60] } End; |
А потом вручную приравнять адреса головы и хвоста - мол, буфер у нас пуст:
Mem[$0040:$001A] := Mem[$0040:$001C];
Про отпускание клавиши - это поэксперементируй и смотри, чего у тебя через Port[$60] лезет. Я уже не помню - давно было.
Вот так... Лень мне что-то ещё писать стало (*улыбается*), ну-ка где тут у нас Google...
Во! Это по теме:
http://pascal.source...rd/vituskbd.htm
Удачи.
#5
Отправлено 20 November 2005 - 15:32
Спасибо большое за подробный ответ, но я им вряд ли воспользуюсь.
(1 -я не умею писать программы, 2 -опаснен, вроде, такой способ:
(1 -я не умею писать программы, 2 -опаснен, вроде, такой способ:
Цитата |
> Все компилиpуется, но после пеpвого же нaжaтия нa клaвишу мaшинa виснет! :-( |
)
#6
Отправлено 20 November 2005 - 18:00
10st!
1) А тогда зачем тебе?
2) Там, кстати, был пример нормально работающей программы + смотря под что ты пишешь - под Windows или DOS (там был пример именно для DOS). Я так подозреваю, что скорее под Windows - а он тебя по ручкам настучит, когда полезешь не туда, куда надо, так что не бойся. Особенно XP. 9х может и прохлопать. (*улыбается*)
1) А тогда зачем тебе?
2) Там, кстати, был пример нормально работающей программы + смотря под что ты пишешь - под Windows или DOS (там был пример именно для DOS). Я так подозреваю, что скорее под Windows - а он тебя по ручкам настучит, когда полезешь не туда, куда надо, так что не бойся. Особенно XP. 9х может и прохлопать. (*улыбается*)