118 lines
3.6 KiB
Plaintext
118 lines
3.6 KiB
Plaintext
# 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
|