Перейти к содержимому


Внимание!

Это форум по извлечению ресурсов из игр: музыки, звуков, текстур, 3D-моделей...
Перед поиском ответов на форуме, рекомендуется ознакомиться с основным сайтом EXTRACTOR.ru!
[ Прочтите внимательно - правила создания тем и ответа в них ]
Все вопросы по запуску игр задавайте в другом месте: Установка и запуск игр.


Фотография

"Разгон" клавиатуры


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 5

#1 10st

10st

    Младший сержант

  • Пользователи
  • 12 сообщений
  • Город:Russia Federation, republic of Tatarstan, Kazan city

Отправлено 12 November 2005 - 20:36

Как увеличить число одновременно нажимаемых клавиш на клавиатуре PS/2 программным способом (т.е. не прибегая к механическим инструментам)?
Это очень актуально в некоторых играх, особенно в эмуляторе приставки
(SEGA - Gens, например).

P.S. Интересно, это вообще возможно?

#2 Siberian_GRemlin

Siberian_GRemlin

    Старший прапорщик

  • Пользователи
  • 166 сообщений
  • Город:Красноярск

Отправлено 13 November 2005 - 13:27

Сомневаюсь, что буфер клавиатуры можно увеличить программно...

#3 Delex

Delex

    Прапорщик

  • Пользователи
  • 143 сообщений
  • Город:Челябинск

Отправлено 13 November 2005 - 14:03

с

#4 -=CHE@TER=-

-=CHE@TER=-

    Полковник

  • Администраторы
  • 971 сообщений
  • Пол:Мужчина

Отправлено 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 10st

10st

    Младший сержант

  • Пользователи
  • 12 сообщений
  • Город:Russia Federation, republic of Tatarstan, Kazan city

Отправлено 20 November 2005 - 15:32

Спасибо большое за подробный ответ, но я им вряд ли воспользуюсь.
(1 -я не умею писать программы, 2 -опаснен, вроде, такой способ:
Цитата
> Все компилиpуется, но после пеpвого же нaжaтия нa клaвишу мaшинa виснет! :-(
)

#6 -=CHE@TER=-

-=CHE@TER=-

    Полковник

  • Администраторы
  • 971 сообщений
  • Пол:Мужчина

Отправлено 20 November 2005 - 18:00

10st!
1) А тогда зачем тебе?
2) Там, кстати, был пример нормально работающей программы + смотря под что ты пишешь - под Windows или DOS (там был пример именно для DOS). Я так подозреваю, что скорее под Windows - а он тебя по ручкам настучит, когда полезешь не туда, куда надо, так что не бойся. Особенно XP. 9х может и прохлопать. (*улыбается*)