Kyselin täällä joskus, miten näppäimistöä pitäisi lukea. Silloin koodasin dos-ympäristössä, ja löysin jostain tällaisen ratkaisun.
void (interrupt far *oldi9)(); void interrupt i9(); void interrupt i9() { key_code=(char)inp(0x60); keys[key_code&0x7F]=(key_code&0x80)>>7; outp(0x20, 0x20); }
Ohjelman alkuun:
oldi9=_dos_getvect(0x09); _dos_setvect(0x09, i9);
Ohjelman loppuun:
_dos_setvect(0x09, oldi9);
Nämähän ovat dos.h:sta löytyviä juttuja. Miten sama tehdään linuxilla?
Toinen kysymys: Mitä tuo outp(0x20, 0x20) oikein tekee? (Sitä lukuun ottamatta olen tajunnut mitä tuossa tapahtuu.)
Teepä BIOS-pohjaltani onnistuuainaki :-) tai laitteisto.
...
mov ah, 00h ;funktio 00h - lue merkki
int 16h ;BIOSin näppäimistöpalvelu
cmp ah, 01h ;painettiinko ESC-näppäintä?
jne jatka ;ellei, jatketaan ohjelman suoritusta
.exit ;lopeta ohjelman suoritus
jatka:
Tuli uusi ongelma. Miten Assembleria koodataan linuxin gcc-kääntäjälle. Watcomilla kirjoitin _asm { (kamaa) }, mutta tämä gcc ei edes tunnista _asm:ää miksikään. Pelkän asm:n se tunnistaa (ilman alaviivaa), mutta sitten se väittää etteivät hakasulkeet mene oikein.
Koska en päässyt vielä testaamaan tuota, täytyy kysyä suoraan. Toimiiko tuo niin, että useampia nappuloita voi pitää yhtä aikaa pohjassa? Rivin "cmp ah, 01h" 01h on ilmeisesti ESC-nappulan numero (ykkönenhän se on), jos tieto ESCin tilasta saadaan tarkastelemalla ah rekisteriä, miten samasta rekisteristä voidaan saada tieto muistakin nappuloista? (Onko ah rekisteri?)
Älä ny Ollia kuuntele ;-) GCC:n inline-asm viritykset ovat aivan oma lukunsa, Googlesta voinet löytää muutamia oppaita miten homma hoituu.
Itse en ole koskaan koodannut Linsuxille mitään mutta suojatussa tilassahan se pirulainen pyörii (vrt. DOS ja real-mode) joten tuskin pääset kovin pitkälle noiden keskeytyksien käytöllä. Katsele vaikka Googlesta, tai tutkiskele muiden ohjelmien sorsia -- taitaa Linsux-softista olla 99% open-sourcea.
lainaus:
Älä ny Ollia kuuntele ;-) GCC:n inline-asm viritykset ovat aivan oma lukunsa, Googlesta voinet löytää muutamia oppaita miten homma hoituu.
Itse en ole koskaan koodannut Linsuxille mitään mutta suojatussa tilassahan se pirulainen pyörii (vrt. DOS ja real-mode) joten tuskin pääset kovin pitkälle noiden keskeytyksien käytöllä. Katsele vaikka Googlesta, tai tutkiskele muiden ohjelmien sorsia -- taitaa Linsux-softista olla 99% open-sourcea.
Siis häh eikö muka sit pääse käsiks näppäimistöön ku toihan tekeesen bios pohjalt ???
No joo. Minusta näyttää siltä, että tuolla bios-jutulla pääse lukemaan sitä näppäimistöbufferia tai jotain vastaavaa. Se ei mahdollista useampien nappuloiden yhtäaikaa painamista (mikä on välttämätöntä peleille), ja dos-ympäristössä ratkaisin ongelman interrupt jutuilla. Kun en osaa samaa linuxilla, tulin tänne kyselemään.
Jos omia näppäimistöinterrupteja ei saa linuxille, niin muutkin ratkaisut kelpaavat. Eli jos joku tietää jotain näppäimistönluku libbejä tai jotain, niin kertokaa vaan.
Olenko ainoa joka yrittää siirtyä koodamaan linuxille?
*deleted*
Eiku nyt en tajuu
siis tota tollahan sä voit vuoron perään tutkia onko joku näppäin pohjas?
Okei, siis ihan aluksi tehdään:
mov ah,00h
Tässä vaiheessa siis kerrotaan mistä nappulasta halutaan tietoa? (Jos "kyllä", niin rupean tajuamaan) Onko ESCin tunnus sitten nolla? Minä luulin että, se on ykkönen. Niinkuin kohdassa:
cmp ah,01h
Tarkoittaako jne "ja niin edelleen", vai onko se assemblerin käskyjä? (varmaan hassu kysymys). Mietin vain mitä se compare sitten kertoo. Ovatko ah ja 01h yhtä suuria kun nappula on painettuna?
(Kyselen kaikenlaista, koska en ole itse vielä päässyt testaamaan tuota)
mov ah, 00h ;funktio 00h - lue merkki toi 00h on siis se funktio mitä käytetään
int 16h ;BIOSin näppäimistöpalvelu
cmp ah, 01h ;painettiinko ESC-näppäintä? ja 01h on ESC näppäin
jne jatka ;ellei, jatketaan ohjelman suoritusta elikkä jos ei painettu esciä hyvätään jatka: kohtaan
.exit ;lopeta ohjelman suoritus
jatka:
En ole tätä itsekkään kokeillut :-), mutta pitäisi toimia
Aihe on jo aika vanha, joten et voi enää vastata siihen.