 
	"Разгон" клавиатуры
		 Автор 
	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х может и прохлопать. (*улыбается*)












