Ç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
+428
View File
@@ -0,0 +1,428 @@
# 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/.
#
# VGA metin kipi sürücüsü: 80×25, imleç, kaydırma, sayı yazımı, UTF-8 & Türkçe font.
VGA = 0xB8000
GENISLIK = 80
YUKSEKLIK = 25
fonksiyon font_cizgi(kod, satir, bayt):
bellek_yaz8(0xA0000 + kod * 32 + satir, bayt)
fonksiyon glif_temizle(kod):
dongu s icinde 0..31:
font_cizgi(kod, s, 0)
fonksiyon turkce_font_kur():
# VGA Plane 2 (yazı tipi belleği) erişimini aç
port_yaz8(0x3C4, 0x02)
port_yaz8(0x3C5, 0x04)
port_yaz8(0x3C4, 0x04)
port_yaz8(0x3C5, 0x07)
port_yaz8(0x3CE, 0x05)
port_yaz8(0x3CF, 0x00)
port_yaz8(0x3CE, 0x06)
port_yaz8(0x3CF, 0x00)
# 1. ı (0x8D - küçük noktasız ı, otantik IBM CP857)
glif_temizle(0x8D)
font_cizgi(0x8D, 5, 0x38)
font_cizgi(0x8D, 6, 0x18)
font_cizgi(0x8D, 7, 0x18)
font_cizgi(0x8D, 8, 0x18)
font_cizgi(0x8D, 9, 0x18)
font_cizgi(0x8D, 10, 0x18)
font_cizgi(0x8D, 11, 0x3C)
# 2. İ (0x98 - büyük noktalı İ, otantik IBM CP857)
glif_temizle(0x98)
font_cizgi(0x98, 1, 0x18)
font_cizgi(0x98, 3, 0x3C)
font_cizgi(0x98, 4, 0x18)
font_cizgi(0x98, 5, 0x18)
font_cizgi(0x98, 6, 0x18)
font_cizgi(0x98, 7, 0x18)
font_cizgi(0x98, 8, 0x18)
font_cizgi(0x98, 9, 0x18)
font_cizgi(0x98, 10, 0x18)
font_cizgi(0x98, 11, 0x3C)
# 3. ş (0x9F - küçük ş, otantik IBM CP857)
glif_temizle(0x9F)
font_cizgi(0x9F, 5, 0x7C)
font_cizgi(0x9F, 6, 0xC6)
font_cizgi(0x9F, 7, 0x60)
font_cizgi(0x9F, 8, 0x38)
font_cizgi(0x9F, 9, 0x0C)
font_cizgi(0x9F, 10, 0xC6)
font_cizgi(0x9F, 11, 0x7C)
font_cizgi(0x9F, 12, 0x18)
font_cizgi(0x9F, 13, 0x30)
# 4. Ş (0x9E - büyük Ş, otantik IBM CP857)
glif_temizle(0x9E)
font_cizgi(0x9E, 2, 0x7C)
font_cizgi(0x9E, 3, 0xC6)
font_cizgi(0x9E, 4, 0xC6)
font_cizgi(0x9E, 5, 0x60)
font_cizgi(0x9E, 6, 0x38)
font_cizgi(0x9E, 7, 0x0C)
font_cizgi(0x9E, 8, 0x06)
font_cizgi(0x9E, 9, 0xC6)
font_cizgi(0x9E, 10, 0xC6)
font_cizgi(0x9E, 11, 0x7C)
font_cizgi(0x9E, 12, 0x18)
font_cizgi(0x9E, 13, 0x30)
# 5. ğ (0xA7 - küçük yumuşak ğ, otantik IBM CP857)
glif_temizle(0xA7)
font_cizgi(0xA7, 2, 0xCC)
font_cizgi(0xA7, 3, 0x78)
font_cizgi(0xA7, 5, 0x76)
font_cizgi(0xA7, 6, 0xCC)
font_cizgi(0xA7, 7, 0xCC)
font_cizgi(0xA7, 8, 0xCC)
font_cizgi(0xA7, 9, 0xCC)
font_cizgi(0xA7, 10, 0xCC)
font_cizgi(0xA7, 11, 0x7C)
font_cizgi(0xA7, 12, 0x0C)
font_cizgi(0xA7, 13, 0xCC)
font_cizgi(0xA7, 14, 0x78)
# 6. Ğ (0xA6 - büyük yumuşak Ğ, otantik IBM CP857)
glif_temizle(0xA6)
font_cizgi(0xA6, 1, 0x66)
font_cizgi(0xA6, 2, 0x7E)
font_cizgi(0xA6, 3, 0x3C)
font_cizgi(0xA6, 4, 0x66)
font_cizgi(0xA6, 5, 0xC2)
font_cizgi(0xA6, 6, 0xC0)
font_cizgi(0xA6, 7, 0xC0)
font_cizgi(0xA6, 8, 0xDE)
font_cizgi(0xA6, 9, 0xC6)
font_cizgi(0xA6, 10, 0x6E)
font_cizgi(0xA6, 11, 0x3A)
# 7. ç (0x87 - küçük ç, otantik IBM CP857)
glif_temizle(0x87)
font_cizgi(0x87, 5, 0x7C)
font_cizgi(0x87, 6, 0xC6)
font_cizgi(0x87, 7, 0xC0)
font_cizgi(0x87, 8, 0xC0)
font_cizgi(0x87, 9, 0xC0)
font_cizgi(0x87, 10, 0xC6)
font_cizgi(0x87, 11, 0x7C)
font_cizgi(0x87, 12, 0x18)
font_cizgi(0x87, 13, 0x30)
# 8. Ç (0x80 - büyük Ç, otantik IBM CP857)
glif_temizle(0x80)
font_cizgi(0x80, 2, 0x3C)
font_cizgi(0x80, 3, 0x66)
font_cizgi(0x80, 4, 0xC2)
font_cizgi(0x80, 5, 0xC0)
font_cizgi(0x80, 6, 0xC0)
font_cizgi(0x80, 7, 0xC0)
font_cizgi(0x80, 8, 0xC0)
font_cizgi(0x80, 9, 0xC2)
font_cizgi(0x80, 10, 0x66)
font_cizgi(0x80, 11, 0x3C)
font_cizgi(0x80, 12, 0x18)
font_cizgi(0x80, 13, 0x30)
# 9. ö (0x94 - küçük ö, otantik IBM CP857)
glif_temizle(0x94)
font_cizgi(0x94, 2, 0xC6)
font_cizgi(0x94, 5, 0x7C)
font_cizgi(0x94, 6, 0xC6)
font_cizgi(0x94, 7, 0xC6)
font_cizgi(0x94, 8, 0xC6)
font_cizgi(0x94, 9, 0xC6)
font_cizgi(0x94, 10, 0xC6)
font_cizgi(0x94, 11, 0x7C)
# 10. Ö (0x99 - büyük Ö, otantik IBM CP857)
glif_temizle(0x99)
font_cizgi(0x99, 1, 0xC6)
font_cizgi(0x99, 3, 0x7C)
font_cizgi(0x99, 4, 0xC6)
font_cizgi(0x99, 5, 0xC6)
font_cizgi(0x99, 6, 0xC6)
font_cizgi(0x99, 7, 0xC6)
font_cizgi(0x99, 8, 0xC6)
font_cizgi(0x99, 9, 0xC6)
font_cizgi(0x99, 10, 0xC6)
font_cizgi(0x99, 11, 0x7C)
# 11. ü (0x81 - küçük ü, otantik IBM CP857)
glif_temizle(0x81)
font_cizgi(0x81, 2, 0xCC)
font_cizgi(0x81, 5, 0xCC)
font_cizgi(0x81, 6, 0xCC)
font_cizgi(0x81, 7, 0xCC)
font_cizgi(0x81, 8, 0xCC)
font_cizgi(0x81, 9, 0xCC)
font_cizgi(0x81, 10, 0xCC)
font_cizgi(0x81, 11, 0x76)
# 12. Ü (0x9A - büyük Ü, otantik IBM CP857)
glif_temizle(0x9A)
font_cizgi(0x9A, 1, 0xC6)
font_cizgi(0x9A, 3, 0xC6)
font_cizgi(0x9A, 4, 0xC6)
font_cizgi(0x9A, 5, 0xC6)
font_cizgi(0x9A, 6, 0xC6)
font_cizgi(0x9A, 7, 0xC6)
font_cizgi(0x9A, 8, 0xC6)
font_cizgi(0x9A, 9, 0xC6)
font_cizgi(0x9A, 10, 0xC6)
font_cizgi(0x9A, 11, 0x7C)
# Standart metin kipine geri dön
port_yaz8(0x3C4, 0x02)
port_yaz8(0x3C5, 0x03)
port_yaz8(0x3C4, 0x04)
port_yaz8(0x3C5, 0x03)
port_yaz8(0x3CE, 0x04)
port_yaz8(0x3CF, 0x00)
port_yaz8(0x3CE, 0x05)
port_yaz8(0x3CF, 0x10)
port_yaz8(0x3CE, 0x06)
port_yaz8(0x3CF, 0x0E)
fonksiyon hucre(satir, sutun, karakter, renk):
bellek_yaz16(VGA + (satir * GENISLIK + sutun) * 2, renk * 256 + karakter)
fonksiyon imleci_tasi(satir, sutun):
konum = satir * GENISLIK + sutun
port_yaz8(0x3D4, 0x0F)
port_yaz8(0x3D5, bit_ve(konum, 0xFF))
port_yaz8(0x3D4, 0x0E)
port_yaz8(0x3D5, bit_ve(saga_kaydir(konum, 8), 0xFF))
fonksiyon konumlandir(satir, sutun):
bellek_yaz64(durum.SATIR, satir)
bellek_yaz64(durum.SUTUN, sutun)
imleci_tasi(satir, sutun)
fonksiyon temizle(renk):
dongu i icinde 0..GENISLIK * YUKSEKLIK - 1:
bellek_yaz16(VGA + i * 2, renk * 256 + 0x20)
konumlandir(0, 0)
bellek_yaz64(durum.RENK, renk)
fonksiyon renk(r):
bellek_yaz64(durum.RENK, r)
fonksiyon kaydir():
dongu i icinde 0..GENISLIK * (YUKSEKLIK - 1) - 1:
bellek_yaz16(VGA + i * 2, bellek_oku16(VGA + (i + GENISLIK) * 2))
r = bellek_oku64(durum.RENK)
dongu s icinde 0..GENISLIK - 1:
hucre(YUKSEKLIK - 1, s, 0x20, r)
fonksiyon alt_satir():
bellek_yaz64(durum.SUTUN, 0)
satir = bellek_oku64(durum.SATIR) + 1
eger satir >= YUKSEKLIK:
kaydir()
satir = YUKSEKLIK - 1
bellek_yaz64(durum.SATIR, satir)
fonksiyon karakter(c):
eger c == 0x0A:
alt_satir()
degilse:
hucre(bellek_oku64(durum.SATIR), bellek_oku64(durum.SUTUN), c, bellek_oku64(durum.RENK))
sutun = bellek_oku64(durum.SUTUN) + 1
bellek_yaz64(durum.SUTUN, sutun)
eger sutun >= GENISLIK:
alt_satir()
imleci_tasi(bellek_oku64(durum.SATIR), bellek_oku64(durum.SUTUN))
fonksiyon geri_sil():
sutun = bellek_oku64(durum.SUTUN)
eger sutun > 0:
bellek_yaz64(durum.SUTUN, sutun - 1)
hucre(bellek_oku64(durum.SATIR), sutun - 1, 0x20, bellek_oku64(durum.RENK))
imleci_tasi(bellek_oku64(durum.SATIR), sutun - 1)
fonksiyon turkce_kod(b, b2):
eger b == 0xC3:
eger b2 == 0xA7: don 0x87 # ç
eger b2 == 0x87: don 0x80 # Ç
eger b2 == 0xB6: don 0x94 # ö
eger b2 == 0x96: don 0x99 # Ö
eger b2 == 0xBC: don 0x81 # ü
eger b2 == 0x9C: don 0x9A # Ü
degilse eger b == 0xC4:
eger b2 == 0x9F: don 0xA7 # ğ
eger b2 == 0x9E: don 0xA6 # Ğ
eger b2 == 0xB1: don 0x8D # ı
eger b2 == 0xB0: don 0x98 # İ
degilse eger b == 0xC5:
eger b2 == 0x9F: don 0x9F # ş
eger b2 == 0x9E: don 0x9E # Ş
don 0
fonksiyon utf8_uc_bayt(b1, b2, b3):
eger b1 == 0xE2:
eger b2 == 0x94:
eger b3 == 0x80: don 0xC4 # ─ (tek yatay çizgi)
eger b3 == 0x82: don 0xB3 # │ (tek dikey çizgi)
eger b3 == 0x8C: don 0xDA # ┌
eger b3 == 0x90: don 0xBF # ┐
eger b3 == 0x94: don 0xC0 # └
eger b3 == 0x98: don 0xD9 # ┘
eger b3 == 0x9C: don 0xC3 # ├
eger b3 == 0xA4: don 0xB4 # ┤
eger b3 == 0xAC: don 0xC2 # ┬
eger b3 == 0xB4: don 0xC1 # ┴
eger b3 == 0xBC: don 0xC5 # ┼
degilse eger b2 == 0x95:
eger b3 == 0x90: don 0xCD # ═ (çift yatay çizgi)
eger b3 == 0x91: don 0xBA # ║ (çift dikey çizgi)
eger b3 == 0x94: don 0xC9 # ╔ (çift sol üst köşe)
eger b3 == 0x97: don 0xBB # ╗ (çift sağ üst köşe)
eger b3 == 0x9A: don 0xC8 # ╚ (çift sol alt köşe)
eger b3 == 0x9D: don 0xBC # ╝ (çift sağ alt köşe)
eger b3 == 0xA6: don 0xCB # ╦ (çift üst birleşim)
eger b3 == 0xA9: don 0xCA # ╩ (çift alt birleşim)
eger b3 == 0xAC: don 0xCE # ╬ (çift artı)
degilse eger b2 == 0x96:
eger b3 == 0x88: don 0xDB # █ (dolu blok)
eger b3 == 0x91: don 0xB0 # ░ (açık gölge)
eger b3 == 0x92: don 0xB1 # ▒ (orta gölge)
eger b3 == 0x93: don 0xB2 # ▓ (koyu gölge)
degilse eger b2 == 0x80:
eger b3 == 0x93: don 0x2D # – (en dash)
eger b3 == 0x94: don 0xC4 # — (em dash)
eger b3 == 0x98 veya b3 == 0x99: don 0x27 # ’ '
eger b3 == 0x9C veya b3 == 0x9D: don 0x22 # “ ”
eger b3 == 0xA2: don 0x07 # • (madde imi)
don 0
fonksiyon glif(cp):
# Unicode kod noktası → VGA glif kodu (ASCII + Türkçe harfler, CP857 yerleşimi).
eger cp < 0x80:
don cp
eger cp == 0xE7: don 0x87 # ç
eger cp == 0xC7: don 0x80 # Ç
eger cp == 0xF6: don 0x94 # ö
eger cp == 0xD6: don 0x99 # Ö
eger cp == 0xFC: don 0x81 # ü
eger cp == 0xDC: don 0x9A # Ü
eger cp == 0x11F: don 0xA7 # ğ
eger cp == 0x11E: don 0xA6 # Ğ
eger cp == 0x131: don 0x8D # ı
eger cp == 0x130: don 0x98 # İ
eger cp == 0x15F: don 0x9F # ş
eger cp == 0x15E: don 0x9E # Ş
don 0x3F # ?
fonksiyon kod_noktasi(cp):
# Klavyeden gelen kod noktasını ekrana yazar.
karakter(glif(cp))
fonksiyon yaz(m):
i = 0
iken bayt(m, i) != 0:
b = bayt(m, i)
eger b < 0x80:
karakter(b)
i = i + 1
degilse eger b >= 0xC0 ve b < 0xE0:
b2 = bayt(m, i + 1)
eger b2 == 0:
don 0
k = turkce_kod(b, b2)
eger k != 0:
karakter(k)
degilse:
karakter(0x3F)
i = i + 2
degilse eger b >= 0xE0 ve b < 0xF0:
b2 = bayt(m, i + 1)
eger b2 == 0:
don 0
b3 = bayt(m, i + 2)
eger b3 == 0:
don 0
k = utf8_uc_bayt(b, b2, b3)
eger k != 0:
karakter(k)
degilse:
karakter(0x3F)
i = i + 3
degilse:
# 4 baytlık UTF-8 veya bilinmeyen sekans
karakter(0x3F)
i = i + 1
fonksiyon satir(m):
yaz(m)
karakter(0x0A)
fonksiyon yaz_konum(satir, sutun, m, r):
eski_satir = bellek_oku64(durum.SATIR)
eski_sutun = bellek_oku64(durum.SUTUN)
eski_renk = bellek_oku64(durum.RENK)
konumlandir(satir, sutun)
renk(r)
yaz(m)
konumlandir(eski_satir, eski_sutun)
renk(eski_renk)
fonksiyon satir_doldur(satir, ch, r):
dongu col icinde 0..GENISLIK - 1:
hucre(satir, col, ch, r)
fonksiyon yatay_cizgi(satir, sol, gen, r):
dongu c icinde sol..sol + gen - 1:
hucre(satir, c, 0xC4, r)
fonksiyon cerceve(ust, sol, gen, yuk, r):
# Çift çizgili donanımsal VGA çerçeve (0xC9, 0xCD, 0xBB, 0xBA, 0xC8, 0xBC)
hucre(ust, sol, 0xC9, r)
hucre(ust, sol + gen - 1, 0xBB, r)
hucre(ust + yuk - 1, sol, 0xC8, r)
hucre(ust + yuk - 1, sol + gen - 1, 0xBC, r)
dongu c icinde sol + 1..sol + gen - 2:
hucre(ust, c, 0xCD, r)
hucre(ust + yuk - 1, c, 0xCD, r)
dongu s icinde ust + 1..ust + yuk - 2:
hucre(s, sol, 0xBA, r)
hucre(s, sol + gen - 1, 0xBA, r)
fonksiyon dikey_ayrac(ust, alt, sutun, r):
hucre(ust, sutun, 0xCB, r)
dongu s icinde ust + 1..alt - 1:
hucre(s, sutun, 0xBA, r)
hucre(alt, sutun, 0xCA, r)
fonksiyon sayi(n):
eger n < 0:
karakter(0x2D)
n = 0 - n
bolen = 1
iken n // bolen >= 10:
bolen = bolen * 10
iken bolen > 0:
karakter(0x30 + (n // bolen) % 10)
bolen = bolen // 10
fonksiyon onaltilik(n):
yaz("0x")
basladi = yanlis
dongu i icinde 0..15:
rakam = bit_ve(saga_kaydir(n, (15 - i) * 4), 0xF)
eger rakam != 0 veya basladi veya i == 15:
basladi = dogru
eger rakam < 10:
karakter(0x30 + rakam)
degilse:
karakter(0x61 + rakam - 10)