Çekirdek örnekleri: KabaLang Minimal Kernel (MPL-2.0) ve üç küçük çekirdek
KabaLang'ın --yalin kipiyle yazılmış, işletim sistemi olmadan açılan x86-64 çekirdeği: kesmeler, 100 Hz zamanlayıcı, Türkçe Q klavye, Türkçe karakterli VGA ekranı, bellek haritası, sayfa ayırıcı, kabuk. Ek örnekler: merhaba, asal sayılar, VGA renkleri.
This commit is contained in:
@@ -0,0 +1,117 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user