Jak odlišit numpad podle scankódů? – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Jak odlišit numpad podle scankódů? – Pascal – Fórum – Programujte.comJak odlišit numpad podle scankódů? – Pascal – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Mircosoft
~ Anonymní uživatel
570 příspěvků
15. 2. 2007   #1
-
0
-

Ahoj programátoři.
Zajímala by mě jedna věc. Pracuju v TP 7. Když si napíšu vlastní obsluhu klávesnice, která visí na int 9 a čte scankódy z port[$60], vrací se mi z numerické klávesnice stejné kódy jako z obyčejných šipek, home, end atd.. Na stavu numlocku vůbec nezáleží. Nikde jsem nenašel způsob, jak na úrovni scankódů numerickou klávesnici odlišit. Jsem si jist, že nějaký způsob určitě existuje, protože jsem viděl pár DOSových her, které to uměly. A taky třeba BIOS (Readkey) to dělá běžně - stačí zapnout numlock a numpad vrací čísla. A BIOS to taky musí na nejnižší úrovni číst ze scankódů, takže to jít musí... jenže jak?

Vím, že jde nějak, tuším, že to byla nějaká služba int $16, nastavit jiné rozložení klávesnice (101 kláves nebo něco jiného, celkem asi tři varianty), ale ta nic neřeší (zkoušel jsem všechny).

Na co to má být: šipky mají dejme tomu hýbat celou obrazovkou, zatímco numerické klávesy něčím na obrazovce (v osmi směrech). Samozřejmě nebufferovaně.

Úkol do školy ani nic životně důležitého to není, takže nijak nepospíchám.
Díky

Nahlásit jako SPAM
IP: ...–
Reklama
Reklama
Laaca0
Stálý člen
15. 2. 2007   #2
-
0
-

Odlišit normální šipky a šipky na numerický klávesnici není úplně sranda. Jde o to, že některé klávesy jsou tzv. rozšířené klávesy. Mezi ně patří třeba normální šipky. Když ji zmáčkneš, tak z portu 60h příjde hodnota 224 (0E0h). Normální rutiny to považují za uvolnění klávesy č. 96 (96+128).
AŽ PŘI DALŠÍM PŘERUŠENÍ potom příjde z portu kód šipky. Proto nezafunguje prostě napsat:



KOD:=Port[$60];
if kod = $E0 then kod:=Port[$60]+PRIZNAK_ROZSIRENE_KLAVESY;

Musíš nechat přerušení skončit (okamžitě se automaticky vyvolá nové) a z něho načíst opravdový kód.

Nahlásit jako SPAM
IP: ...–
DOS-u-akbar
Mircosoft
~ Anonymní uživatel
570 příspěvků
16. 2. 2007   #3
-
0
-

Aha, super. Vyzkouším a uvidím.
Dík moc!

Nahlásit jako SPAM
IP: ...–
Mircosoft
~ Anonymní uživatel
570 příspěvků
18. 2. 2007   #4
-
0
-

Paráda, funguje to.

Pro zájemce:

globální proměnné:



var rozsirena:byte; {informace o tom, jestli posledni precteny scankod byl kod pro
rozsirenou klavesu (pak rozsirena=128) nebo ne (rozsirena=0)}
_klavesy:^array[0..255] of boolean;


Stačí připravit buffer _klavesy, ulozit vektor preruseni int 9 (Getintvec) a povesit tam tohle (pres Setintvec):


procedure SpecialInt9; interrupt; assembler;
Asm
cli
in AL,$60
cmp AL,$E0 {je rozsirena?}
jne @normalni {neni => zpracujeme scankod}
mov rozsirena,128 {zapamatovat pro priste...}
jmp @konec {...a zatim konec}
@normalni:
mov BL,AL
and BL,$7F {v BL je ted samotny scankod}
add BL,rozsirena {ted mame v BL skutecny index pro pole _klavesy}
xor BH,BH
and AL,$80 {v AL je ted pouze nejvyssi bit hodnoty z portu (stisknuto/pusteno)}
xor AL,$80
rol AL,1 {prevedeno na boolean}
les DI,_klavesy
mov ES:[DI+BX],AL {do pole na index BX (cislo klavesy) vloz hodnotu AL (stav te klavesy)}
mov rozsirena,0 {nutne pro priste}
@konec:
mov AL,$20
out $20,AL {konec preruseni}
sti
End;

Doufám, že Assembler není v sekci pro Pascal zakázaný :-).

Off topic: Zvláštní je, že nejde stisknout neomezené množství kláves najednou. Obvykle když držím cca tři a zmáčknu čtvrtou, už se mi nenačte. To ale není vždy stejné: čím jsou nižší hodnoty scankódů těch stisknutých kláves, tím víc jich můžu stisknout (v oblasti vlevo nahoře na klávesnici třeba i pět a všechny se načtou). Zvláštní. No nic, to už mi nevadí.

Nahlásit jako SPAM
IP: ...–
Laaca0
Stálý člen
18. 2. 2007   #5
-
0
-

Kolik kláves najednou ti to zdetekuje záleží na typu klávesnice. Jó, dřív, to byly klávesnice. Ty nový jsou v tomhle směru dost jakože na hovno. Třeba takový Mortal Kombat ve dvou na nových klávesnicích celkem často zlobí - postavičky občas neudělají nějaký pohyb jen proto, že je přeplněná "kapacita klávesnice"

Nahlásit jako SPAM
IP: ...–
DOS-u-akbar
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 12 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý