Táblázatok

From Enterprise Wiki
Revision as of 10:00, 3 May 2010 by Szipucsu (talk | contribs) (org helyett com)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Táblázatok

A konverziós táblák felépítése

A taszt-konverzió 4 táblán keresztül valósul meg.

Taszt tables.png

- Van --max. 3 menetben-- a "korrekciós" konverzió. Ezekben a táblákban több bemenethez tartozhat egy (vagy akár több) kimenet. (Késõbb majd érthetõbb lesz, a példákból :-) )

[quote](Miért pont 3? Egy alap, kikapcsolhatatlanul, amire mindig szükség van, vélhetõleg. Ilyenek pl. a lapozó gombok. Egy másik tábla az adott (nyelvi) konfignak megfelelõ, egy pedig a RAM-ban, játszani, próbálkozni, ill. ideiglenes definíciók számára. Mindegyiket külön-külön át lehet programozni, a többi macerálása nélkül.) [/quote]

A 3 tábla szintaxisa, használata teljesen egyforma. Csak a --feldolgozási-- sorrendjük kötött. Ha valamelyik táblában "találat" van, akkor a feldolgozás ott véget ér, a többi tábla már nem kerül sorra. Ha egyik táblában sincs találat, akkor jön az EEPROM tábla.

- Ezután a keyboard által küldött scan kódokat átalakítom "EP" kódokra (vagyis egy saját kódra, ami persze az EP keyboard táblájából adott). Ez a tábla egy-az-egyben megfeleltet egy-egy bill. lenyomást/elengedést. Ez az alap, minden EP billentyûhöz tartozik legalább egy megfeleltetés. (Akár több is, mivel a PC taszton több gomb van.)


Essünk neki! :-) Itt az EEPROM táblája: [1] a belsõ "EP" kódok: [2] Ill. kicsit olvashatóbb formában a 2-es scan kódok: [3]

Ha valaki a képet kedveli: Taszt eptastnums thumb.jpg Taszt scancodes thumb.jpg (Az utóbbi innen kölcsönözve. Itt a PC taszt protokollja is megtalálható.)

Vegyük pl. az "A" gombot. A PC taszt --lenyomáskor-- 1Ch kódot küld ki, az EEPROM 1C-edik értéke 15h. (Ez egy belsõ RAM táblába kerül, az IT rutin a tábla alapján "nyomogat".) Az "A" gomb felengedésekor a PC taszt F0 1C kódot küld ki, ebbõl a RAM-ba végül 15h+8 (1Dh) kerül (b3 bit jelzi a felengedést). Az extended kódok kezelése nem itt, vagy egyáltalán nem történik. A "/" és a Keypad "/" gombok pl. (4A ill. E0 4A) egyaránt ugyanazt az "EP" kódot (80h) eredményezik.

Ez tehát az "egy gomb itt - egy gomb ott" táblája.

Most jön a neheze. De elõbb egy kis kitérõ. A váltógombokról állapot-infót tárolok, vagyis a LeftShift, RightSift, Ctrl (bármelyik), LeftAlt, RightAlt (vagy AltGrey) gombok lenyomásának állapotát nyilvántartom (a PC taszt állapotát, nem az EP-ét). No tehát. A probléma a következõ: egy vagy több PC bill.-nek az EP egy vagy több bill.-je kell megfeleljen. Pl. az USA taszton a "'" (aposztróf) egygombos, míg az angol EP-n Shift+7. A magyar taszton Shift+1, a német EP-n meg egygombos. Viszont nemcsak a bill. lenyomását, hanem a felengedését is emulálni kell, így még tovább bonyolódik a helyzet (fordított sorrend az elengedésnél).

[hr]

Nézzünk itt is egy példát, legyen akkor az aposztróf. USA -> angol táblázatból a megfelelõ sor:

[font=Courier New]0x00+ANY+REV, 0x52, KEY_META_SHIFTS, KEY_7, KEY_NO, [/font] 52 a "'" scan-kódja KEY_7 a "7" EP kódja (epkeys.h-ban az értéke) KEY_META_SHIFT ez egy belsõ kód (mivel bármelyik shift lehet) 0x00+ANY+REV ezek a státuszbitek.

Egy definíció tehát így néz ki: státuszbitek, scan kód, EP kód(ok), lezáró (KEY_NO)

A státuszbitekben lehet jelezni - MAKE/BREAK állapotot (BRK) (PC gombra vonatkozik) - extended scan kódot (EXT) - a váltógombok állapotát, - azt, hogy ezek együttesen vagy bármelyik közülük elég-e (ANY) - a definíció oda-vissza érvényes-e (REV)

A scan kód egyértelmû, 2-es scankódtábla alapján.

"EP" kód pedig akár több is lehet, erre egy (jelenleg 8 elemû) puffert tartok fenn. Ezek között vannak metakódok is, ezek speciálisak, mert vagy nem, vagy nem egyértelmû bill.-höz tartoznak.

A fenti definíció tehát azt mondja: ha a bejövõ scan kód 52h [i]és[/i] bármilyen váltógomb-állapot is van, akkor: - lenyomáskor [i]elõbb[/i] legalább az egyik shiftet (most éppen a leftshift van bedrótozva) kell lenyomni, [i]aztán[/i] a 7-es gombot. - elengedéskor fordított a sorrend, [i]elõbb[/i] a 7-est kell elengedni, [i]aztán[/i] a shiftek állapotát visszaállítani (figyelem! nemcsak a leftshift-et! Ezért "meta" kód )

[hr]

Másik példa, PC-n Shift, EP-n nem. A "+" jel, HUN->BRD táblában:

[font=Courier New]// (+) Shift+3 -> [ (shifts care)

 0x20+REV, US_3, KEY_META_SH_BRK, KEY_LBRACKET,			KEY_NO,[/font]

0x20 bármelyik shift lenyomva KEY_META_SH_BRK ez is egy metakód, jelentése: elengedni minden shiftet, break esetén pedig visszaállítani

Tehát: ha shift nyomva és "3"-as bill. scan kódja jön, akkor - make esetén shift-eket elengedni, aztán "[" (angol taszt szerint) - break esetén "["-t elengedni, aztán Shift-ek állapotát vissza.


[hr]

Egy bonyolultabb példa, az "ö" betû, HUN->EPDOS viszonylatban:

[font=Courier New]// (oe) 0 -> Alt+G (shifts care)

 0x00+ANY+REV, US_0, KEY_ALT, KEY_G,					KEY_NO,

// (OE) Shift+0 -> Alt+T (shifts care)

 0x20+REV, US_0, KEY_META_SH_BRK,, KEY_ALT, KEY_T, 			KEY_NO,[/font]

0x20 bármelyik shift lenyomva US_0 ez a 9-estõl jobbra levõ gombot jelenti. Lusta voltam HUN_?? definíciókat készíteni, így mindenhol az US elrendezés szerint vannak

0x00+ANY+REV jelentése: _nincs_ shift lenyomva (és a def. visszafelé is érvényes)

Az elsõ sor tehát ezt mondja: ha [i]nincs[/i] shift nyomva [i]és[/i] a magyar taszton az "Ö" betû scan kódja jön (USA taszton "0"), akkor - lenyomáskor elõbb az Alt, aztán a "G" bill-t kell lenyomni - felengedéskor fordítva, elõbb a "G"-t, aztán az Alt-ot elengedni.

2-ik: Ha a shift lenyomva, és US_0 scan kód jön (vagyis magyar taszton Shift+Ö -t nyomtak), akkor elõbb el kell engedni mindkét shiftet (mert nem tudom, melyik van nyomva, de egyik sem maradhat úgy), Aztán Alt+T -t nyomni. Break (elengedés) esetén visszafelé: Shift lenyomva [i]és[/i] US_0 break kód jön, akkor T-t elengedni, aztán az Alt-ot.

[hr]

Itt rögtön van egy érdekesség. Amikor --sorrendben-- megnyomod a Shift-et, ez "átfut", lesz egy lenyomott Shift. Aztán hozzá az "Ö"-t, akkor --mivel az EPDOS Shift nélkül várja a nagybetût (???)-- az EP-n fel kell engedni. Most tehát a PC és az EP Shift állapota nem egyezik. Ezt vissza kell állítani elengedéskor. Ez meg is történik. De. Ha felengedéskor [i]elõbb[/i] a Shift gombot engeded el, [i]aztán[/i] az "Ö"-t, akkor az már nem fogja "triggerelni" a def. sort (mert az lenyomott Shift-et vár). Ez igaz az összes olyan esetre, ahol a PC és az EP bill. más Shift állapotban van. Ezért (hogy Shift ne ragadjon be) van két külön definíció: [quote](Ez egy kissé bumfordi, de hatékony megoldás. Jobb nem jutott eszembe.)[/quote]

[font=Courier New]// Shifts release

 0x28, US_LSHIFT, KEY_ALLBREAK, 		KEY_META_CONT,
 0x28, US_RSHIFT, KEY_ALLBREAK, 		KEY_META_CONT,[/font]

0x28 (0x20+BRK) bármelyik shift elengedése KEY_ALLBREAK metakód, minden gombot elenged KEY_META_CONT ez egy különleges lezárókód. Normál esetben, ha egy def. sor "triggerel", akkor csak az abban leírtakat hajtom végre, az EEPROM táblát nem használom. Ebben az esetben viszont az EEPROM tábla [i]is[/i] végrehajtásra kerül. [quote] (Hmmm. Ami az adott esetben értelmetlen. Hiszen úgyis minden gombot elngedek, így a Shift-et is. Ez még megmaradt, egy régebbi változatból, most derült csk ki, hogy már nem kell. Legalábbis ide. Ezért jó dokut írni :) )[/quote]

Apropó. Minden "EP" kód, ami ezekben a definíciókban szerepel (KEY_????), egy queue-ba kerül. Az EEPROM táblából jövõk viszont nem. A queue ürítésekor viszont várok egy teljes scan ciklust (20 msec az EP-ben), minden egyes bill.-nél. Muszáj, különben nem jutna érvényre. Emiatt az egész taszt-illesztõ "késik". Akár 40 msec-et is. 20-at a queue ürítésekor, és még 20-at, amíg a scan érvényre lép. Sorry.

[quote]Az egész konverzió egy RAM területet irkál csak. A tényleges információ az EP számára egy IT rutinban történik. A WR0 jel (U25-ös IC 11-es láb) hatására beolvasom az adatbuszt, ez címzi a RAM táblát. Az ott található értéket pedig kiteszem az U27 bemenetére. Viszont csak akkor tehetem ki, ha éppen azt a sort címzi az EP. Meg kell tehát várnom egy ciklust. Másképpen fogalmazva: az EP belsõ tasztja statikus, míg a taszt-illesztõ dinamikus mûködésû. Egyfolytában változik a kimenete.[/quote]

[hr]

Huh. Itt vannak a táblák: [4] [5] [6] [7]

A táblákat egyenként át lehet írni, nem kell az egész programot módosítani hozzá. A dinamikus helykihasználás érdekében mindegyikre pointer mutat. Valahogy így:

Taszt tabptr.png

A CRC ellenõrzés a táblákra nem vonatkozik, csak a "main" részre.

[hr]

Egy sor felépítése tehát:

MODBYTE, SCANCODE, EPCODE, ..... , DEFEND

MODBYTE: b7 Alt (LeftAlt) lenyomva b6 Ctrl (bármelyik) lenyomva b5 Shift (bármelyik) lenyomva b4 AltGr (RightAlt) lenyomva b3 BREAK flag (felengedés) b2 ANY flag b1 REVERSE flag (a definíció oda-vissza érvényes) b0 Extended code (PC ext. scan code)

SCANCODE: scan code set 2, az extended és a break code nélkül (ezek a MODBYTE-ba kerülnek)

A MODBYTE és a SCANCODE tehát azonosítanak egy [i]input[/i] eseményt. Ez egy tetszõleges PC bill. lenyomása vagy felengedése, plusz a váltógombok aktuális állapota.

EPCODE: Ez(ek) kerül(nek) a queue-n keresztül az EMURAM-ba. Ez tehát az [i]output[/i]. Értéke 10..17, 20..27,... 90..97 a lenyomott billentyûkre. Felengedéshez pedig b3 (BREAK bit) is beállítva (18..1F,....,98..9F)

DEFEND: a def. végét jelzi, értéke KEY_NO (FFh)

Ha tehát egy definíció BREAK flag nélkül van, akkor egy billentyû lenyomására aktiválódik. Ilyenkor a queue-ba az EPCODE-ok kerülnek, balról jobbra, ahogy vannak. Ha a definícióban a REVERSE flag is aktív [i]és[/i] felengedett input esemény van, akkor a definíció alapján [i]jobbról balra[/i] kerülnek a queue-ba az EPCODE-ok, de [i]invertált[/i] BREAK bittel.

Az ANY flag eredetileg arra szolgált, hogy a váltóbillentyûk között VAGY kapcsolatot létesítsen. Egy ilyen definíció tehát a benne szereplõ váltógombok [i]bármelyikére[/i] aktív. De sokkal fontosabb a másik használata, amikor egyetlen váltógomb [i]sem[/i] szerepel a MODBYTE-ban. Ilyenkor váltógombok nélküli definíciót jelent. (Tehát nem igaz olyan állapotokra, amikor bármelyik aktív). Lássuk pédákkal:

0xC0+ANY -> Ctrl és Alt gombok közül bármelyik. 0x00+ANY -> Egyetlen váltógomb sem lehet aktív.


A metakódok:

KEY_META_SCRL, KEY_META_NUML, KEY_META_CAPSL A megfelelõ LED-ek bekapcsolására. Értelme semmi, csak plusz fogyasztást jelentenek. A NumLock ráadásul megbolondítja az extended key-k mûködését.

KEY_META_TABSW0, .. . KEY_META_TABSW3 A 2 kapcsolható (tab_lang, tab_ram) konverziós tábla ki-bekapcsolására szolgál. 0 egyik sem aktív 1 lang 2 ram 3 mindkettõ aktív

KEY_META_OSCxxx Ezek tesztcélokat szolgálnak, a belsõ oszcillátor frekijének kiiratásához, módosításához (tab_all: Ctrl+Alt+ KP+, KP-, KP*)

KEY_META_SHIFTS Ez lenyomja a LeftShift-et. Ellentettje (break párja) KEY_META_RESTORE

KEY_META_RESTORE A két shiftet a --tárolt-- PC állapotnak megfelelõen beállítja.

KEY_META_SH_BRK Mindkét Shift-et felengedi. Break párja KEY_META_RESTORE

KEY_ALLBREAK minden gombot felenged. Ellentettje KEY_ALLMAKE (lenne, ha megírtam volna. De minek? :))

KEY_META_FORCE ez arra szolgál, hogy "erõszakkal" kirakjuk az EMURAM állapotát a portra. A STOP bill. (Ctrl+Break) így mûködik tape LOAD esetén. Hasznos lehet még játékoknál, ha a keyboard scan-t nem használnák. [quote]Ez durva megsértése az IT rutin lényegének. Csak indokolt esetben szabad használni. [/quote]

KEY_META_STOP Ez elõször "normál" STOP billenytût próbál nyomni. Ha adott ideig nem sikerül (az EP nem címzi azt a sort), akkor KEY_META_FORCE lesz belõle.


[hr]

Egy kis segítség: A Ctrl+Alt+PrtScr hatására debug módba kerül a program. Ilyenkor minden egyes billentyûre kiírja az inputot, amit kap, 16 bites számként, és az outputot (8 bites számok), ami ennek hatására a queue-ba kerülne. Ezzel lehet tesztelni a konverziós tábla mûködését, ill. hogy mi is jön ki a PC tasztból (nem a kapott PS2 kódokat mutatom, hanem amit a rutin kap, tehát a tábla felépítése szerint). Kilépni a debug módból ugyanezzel a 3 gombbl lehet (de gyorsan kell nyomni :) ) Vagy pedig Ctrl+Alt+Del, ez pedig SW reset-et generál. [quote]Ez a két spec. "3ujjas" kombináció nem a táblákban van, a fõprogramba van bedrótozva.[/quote]

[hr]