Ç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,133 @@
|
||||
# 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/.
|
||||
#
|
||||
# Basit komut satırı: satır düzenleme, yerleşik komutlar ve UTF-8 tamponu.
|
||||
|
||||
kullan "arayuz.kbl"
|
||||
kullan "bellek.kbl"
|
||||
|
||||
AZAMI = 120
|
||||
ISTEM_RENGI = 0x1E # mavi zemin, sarı yazı
|
||||
YAZI_RENGI = 0x17 # mavi zemin, gri yazı
|
||||
|
||||
fonksiyon istem():
|
||||
ekran.renk(ISTEM_RENGI)
|
||||
ekran.yaz("kaba> ")
|
||||
ekran.renk(YAZI_RENGI)
|
||||
bellek_yaz64(durum.SATIR_UZUNLUK, 0)
|
||||
|
||||
fonksiyon uzunluk():
|
||||
don bellek_oku64(durum.SATIR_UZUNLUK)
|
||||
|
||||
fonksiyon satir_metni():
|
||||
# Komut satırı tamponundan metin (yığından ayrılır, iş bitince bırakılır).
|
||||
don metin_oku(durum.KABUK_TAMPON, uzunluk())
|
||||
|
||||
fonksiyon komut_mu(satir, tr, ascii):
|
||||
# Komutlar Türkçe yazımıyla ve ASCII karşılığıyla kabul edilir (yardım = yardim).
|
||||
don satir == tr veya satir == ascii
|
||||
|
||||
fonksiyon yardim():
|
||||
ekran.satir("Komutlar (Türkçe ya da ASCII yazılabilir):")
|
||||
ekran.satir(" yardım bu liste")
|
||||
ekran.satir(" panel sistem gösterge panelini çizer")
|
||||
ekran.satir(" türkçe Türkçe karakter vitrini")
|
||||
ekran.satir(" hakkında çekirdek bilgisi")
|
||||
ekran.satir(" zaman açılıştan beri geçen süre")
|
||||
ekran.satir(" yaz METİN metni ekrana yazar")
|
||||
ekran.satir(" uzunluk METİN metnin harf sayısı (UTF-8)")
|
||||
ekran.satir(" klavye tr|us klavye düzeni")
|
||||
ekran.satir(" bellek bellek haritası ve sayfa ayırıcı")
|
||||
ekran.satir(" ayır sayfa ayırıcıyı dener")
|
||||
ekran.satir(" yığın yığın kullanımı")
|
||||
ekran.satir(" temizle ekranı temizler")
|
||||
ekran.satir(" kapat makineyi kapatır")
|
||||
|
||||
fonksiyon calistir():
|
||||
eger uzunluk() == 0:
|
||||
don 0
|
||||
satir = satir_metni()
|
||||
eger komut_mu(satir, "yardım", "yardim"):
|
||||
yardim()
|
||||
degilse eger satir == "panel":
|
||||
arayuz.panel_ciz()
|
||||
degilse eger komut_mu(satir, "türkçe", "turkce"):
|
||||
arayuz.turkce_vitrin()
|
||||
degilse eger komut_mu(satir, "hakkında", "hakkinda"):
|
||||
ekran.satir("KabaLang mini çekirdek — KabaLang ile yazıldı, LLVM ile derlendi.")
|
||||
ekran.satir("x86-64 uzun kip, 100 Hz zamanlayıcı, PS/2 klavye (Türkçe Q), VGA metin kipi.")
|
||||
degilse eger satir == "zaman":
|
||||
t = bellek_oku64(durum.TIK)
|
||||
ekran.satir(f"Açılıştan beri: {t // 100}.{(t % 100) // 10} sn")
|
||||
degilse eger satir == "temizle":
|
||||
ekran.temizle(YAZI_RENGI)
|
||||
degilse eger satir == "bellek":
|
||||
bellek.haritayi_yaz()
|
||||
degilse eger komut_mu(satir, "yığın", "yigin"):
|
||||
ekran.satir(f"Yığın: {calisma_zamani.yigin_kullanilan()} bayt kullanılıyor")
|
||||
degilse eger satir.ile_baslar("uzunluk "):
|
||||
m = satir.parca(8, satir.uzunluk() - 8)
|
||||
ekran.satir(f"\"{m}\": {m.uzunluk()} harf")
|
||||
degilse eger satir == "klavye tr":
|
||||
klavye.duzen(0)
|
||||
ekran.satir("Klavye: Türkçe Q")
|
||||
degilse eger satir == "klavye us":
|
||||
klavye.duzen(1)
|
||||
ekran.satir("Klavye: ABD")
|
||||
degilse eger komut_mu(satir, "ayır", "ayir"):
|
||||
a = bellek.sayfa_ayir()
|
||||
b = bellek.sayfa_ayir()
|
||||
ekran.yaz("ayrıldı: ")
|
||||
ekran.onaltilik(a)
|
||||
ekran.yaz(" ")
|
||||
ekran.onaltilik(b)
|
||||
ekran.karakter(0x0A)
|
||||
bellek.sayfa_birak(a)
|
||||
c = bellek.sayfa_ayir()
|
||||
ekran.yaz("bırakılıp yeniden ayrılan: ")
|
||||
ekran.onaltilik(c)
|
||||
eger c == a:
|
||||
ekran.satir(" (geri verilen sayfa yeniden kullanıldı)")
|
||||
degilse:
|
||||
ekran.karakter(0x0A)
|
||||
degilse eger satir.ile_baslar("yaz "):
|
||||
ekran.satir(satir.parca(4, satir.uzunluk() - 4))
|
||||
degilse eger satir == "kapat":
|
||||
ekran.satir("Kapatılıyor...")
|
||||
seri.satir("kabuk: kapat")
|
||||
port_yaz16(0x604, 0x2000)
|
||||
degilse:
|
||||
ekran.satir("Bilinmeyen komut: " + satir)
|
||||
don 0
|
||||
|
||||
fonksiyon tampona_ekle(b):
|
||||
bellek_yaz8(durum.KABUK_TAMPON + uzunluk(), b)
|
||||
bellek_yaz64(durum.SATIR_UZUNLUK, uzunluk() + 1)
|
||||
|
||||
fonksiyon son_harfi_sil():
|
||||
# UTF-8: devam baytlarını (10xxxxxx) ve baş baytı birlikte siler.
|
||||
n = uzunluk()
|
||||
iken n > 0 ve bit_ve(bellek_oku8(durum.KABUK_TAMPON + n - 1), 0xC0) == 0x80:
|
||||
n = n - 1
|
||||
eger n > 0:
|
||||
n = n - 1
|
||||
bellek_yaz64(durum.SATIR_UZUNLUK, n)
|
||||
|
||||
fonksiyon tus(cp):
|
||||
# Klavyeden gelen bir kod noktasını işler; tampon UTF-8 tutar.
|
||||
eger cp == 0x0A:
|
||||
ekran.karakter(0x0A)
|
||||
calistir()
|
||||
istem()
|
||||
degilse eger cp == 0x08:
|
||||
eger uzunluk() > 0:
|
||||
son_harfi_sil()
|
||||
ekran.geri_sil()
|
||||
degilse eger cp != 0 ve uzunluk() < AZAMI - 1:
|
||||
eger cp < 0x80:
|
||||
tampona_ekle(cp)
|
||||
degilse:
|
||||
tampona_ekle(bit_veya(0xC0, saga_kaydir(cp, 6)))
|
||||
tampona_ekle(bit_veya(0x80, bit_ve(cp, 0x3F)))
|
||||
ekran.kod_noktasi(cp)
|
||||
Reference in New Issue
Block a user