# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. # # PS/2 klavye: tarama kodu kümesi 1 → Unicode kod noktası, kesme kuyruğu. # # Varsayılan düzen Türkçe Q; `klavye us` ile ABD düzenine geçilir. Shift # kesme anında izlenir ve tuşla birlikte kuyruğa yazılır (bit 7), böylece # ana döngü geç işlese de doğru harf çıkar. İ/ı ayrımı Türkçe kuralıyla: # ı tuşu shift ile I, i tuşu shift ile İ verir. # Dizin = tarama kodu. `~` = Türkçe harf (aşağıda ayrıca) ya da karşılıksız. # `\0` KULLANILMAZ: dil C kuralını izler, `\0`dan sonraki rakamlar sekizli kaçıştır. TR_KUCUK = "~~1234567890*-~~qwertyu~op~~~~asdfghjkl~~\"~,zxcvbnm~~." TR_BUYUK = "~~!'^+%&/()=?_~~QWERTYU~OP~~~~ASDFGHJKL~~~~;ZXCVBNM~~:" US_KUCUK = "~~1234567890-=~~qwertyuiop[]~~asdfghjkl;'`~\\zxcvbnm,./" US_BUYUK = "~~!@#$%^&*()_+~~QWERTYUIOP{}~~ASDFGHJKL:\"~~|ZXCVBNM<>?" YOK = 0x7E UZUNLUK = 0x36 ENTER = 0x1C GERI = 0x0E BOSLUK = 0x39 SOL_SHIFT = 0x2A SAG_SHIFT = 0x36 BIRAKMA = 0x80 fonksiyon kesmede_al(): # Kesme işleyicisinden çağrılır: basılan tuşu (shift durumuyla) kuyruğa yazar. kod = port_oku8(0x60) eger kod == SOL_SHIFT veya kod == SAG_SHIFT: bellek_yaz64(durum.KB_SHIFT, 1) degilse eger kod == SOL_SHIFT + BIRAKMA veya kod == SAG_SHIFT + BIRAKMA: bellek_yaz64(durum.KB_SHIFT, 0) degilse eger kod < BIRAKMA: eger bellek_oku64(durum.KB_SHIFT) == 1: kod = kod + BIRAKMA y = bellek_oku64(durum.KB_YAZ) bellek_yaz8(durum.KB_TAMPON + bit_ve(y, 0xFF), kod) bellek_yaz64(durum.KB_YAZ, y + 1) fonksiyon bekleyen_var_mi(): don bellek_oku64(durum.KB_OKU) != bellek_oku64(durum.KB_YAZ) fonksiyon kod_al(): # Kuyruktaki sıradaki tuş: bit 7 = shift, alt 7 bit = tarama kodu. o = bellek_oku64(durum.KB_OKU) kod = bellek_oku8(durum.KB_TAMPON + bit_ve(o, 0xFF)) bellek_yaz64(durum.KB_OKU, o + 1) don kod fonksiyon tarama_kodu(kod): don bit_ve(kod, 0x7F) fonksiyon duzen(d): bellek_yaz64(durum.KB_DUZEN, d) fonksiyon turkce_harf(t, buyuk): # Türkçe Q'daki Türkçe harf tuşları; değilse 0. eger t == 0x17: eger buyuk: don 0x49 # I don 0x131 # ı eger t == 0x28: eger buyuk: don 0x130 # İ don 0x69 # i eger t == 0x1A: eger buyuk: don 0x11E # Ğ don 0x11F # ğ eger t == 0x1B: eger buyuk: don 0xDC # Ü don 0xFC # ü eger t == 0x27: eger buyuk: don 0x15E # Ş don 0x15F # ş eger t == 0x33: eger buyuk: don 0xD6 # Ö don 0xF6 # ö eger t == 0x34: eger buyuk: don 0xC7 # Ç don 0xE7 # ç don 0 fonksiyon karakter(kod): # Tuşun Unicode kod noktası; Enter 0x0A, geri silme 0x08, karşılıksızsa 0. t = tarama_kodu(kod) buyuk = kod >= BIRAKMA eger t == ENTER: don 0x0A eger t == GERI: don 0x08 eger t == BOSLUK: don 0x20 eger t >= UZUNLUK: don 0 eger bellek_oku64(durum.KB_DUZEN) == 0: h = turkce_harf(t, buyuk) eger h != 0: don h eger buyuk: c = bayt(TR_BUYUK, t) degilse: c = bayt(TR_KUCUK, t) degilse: eger buyuk: c = bayt(US_BUYUK, t) degilse: c = bayt(US_KUCUK, t) eger c == YOK: don 0 don c