Ç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:
2026-10-17 13:09:50 +03:00
parent e0e4a0d6c7
commit c5468f5d0a
24 changed files with 2279 additions and 2 deletions
+117
View File
@@ -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