( Chain-Q | 2018. 06. 04., h – 22:58 )

Az úgy néz ki, hogy a drájvernek van egy felülete, amin keresztül fel lehet iratkozni különböző üzenetekre, amit a kártya küld, pl. "valami beleírt a CRTC regiszterekbe", "valami beleírt a grafikus memóriába", "jaj, üres a keyboard buffer, küldjél keyeventet", stb. Ez utóbbit úgy csinálod, hogy beleírsz egy megadott keyboard regiszterbe egy XT vagy AT keyboard scancode-ot majd egy külön interrupt trigger regiszterben keyboard megszakítást triggerelsz. Egyszer csak, teljesen random módon (vagy annak tűnően, általában akkor ha nagyon nagy sebességgel küldök code-okat), nem jön több "küldjél keyeventet" üzenet, legalábbis az elküldött keycodeot úgy tűnik feldolgozza a PC, de aztán üzenet nem jön, hogy küldjek még. Szerintem valami race van, mert általában akkor történik ilyesmi, ha mellé heveny egyéb I/O is zajlik, pl. keyboard refresh, vagy file I/O az Amiga felől.

A workaround annyi, hogy szerencsére van egy "interrupt pending" regiszter a PC oldalán, ahol a "keyboard interrupt pending" bit kikapcsol, ha a PC feldolgozta a triggerelt billentyűzet megszakítást. Így normál esetben a notification után küldök további keycode-ot, illetve figyelem ezt az interrupt pending regisztert, és ha már "elég sok idő eltelt" mióta a PC nem válaszolt, akkor egyszerűen küldök egy további keycode-ot - ez pedig általában kirúgja a kártyát a billentyűzet-kezelési "deadlockból" és utána újra jönnek üzenetek. Elég vicces.

További védelemként - mivel a PC általában jóval lassabb mint egy bővített Amiga - az Amiga oldali keyqueue-ba nem írok végtelen számú ismétlést, és ha azonos a scancode az előzővel amit beleírnék és a PC még nem dolgozta fel az előzőt, akkor skippelem és nem küldöm el neki. Ez valamekkora védelmet ad, hogy ne legyen az, hogy felengedsz egy gombot amit folyamatosan nyomvatartottál, és még 5mp-ig írja befele a karaktereket a PC. Viszont mivel a felengedés scancode-ja eltérő, ezért a lenyomás-felengedés párost mindig megkapja a PC.

-=- Mire a programozó: "Na és szerintetek ki csinálta a káoszt?" -=-