Files
ornekler/cekirdek/merhaba/merhaba_cekirdek.kbl
T
semih c5468f5d0a Ç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.
2026-10-17 13:09:50 +03:00

113 lines
4.1 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/.
#
# KabaLang ile yazılmış en küçük çekirdek: seri porta ve VGA metin ekranına yazar.
#
# Derle: kabalang derle --yalin merhaba_cekirdek.kbl -o cekirdek.elf
# Çalıştır: qemu-system-x86_64 -kernel cekirdek.elf -serial stdio
#
# Yalın kipte çalışma zamanı YOKTUR: metin sabitleri ham bayt dizisidir,
# donanıma `port_yaz8` (x86 out) ve `bellek_yaz16` (volatile yazma) ile
# erişilir. Önyükleme parçası (calisma/yalin/boot.S) yalnız uzun kipe geçip
# `kaba_cekirdek_ana`yı çağırır; mantığın tamamı bu dosyadadır.
SERI = 1016 # COM1 (0x3F8)
VGA = 753664 # VGA metin belleği (0xB8000)
GENISLIK = 80
fonksiyon seri_hazirla():
port_yaz8(SERI + 1, 0) # kesmeler kapalı
port_yaz8(SERI + 3, 128) # DLAB
port_yaz8(SERI + 0, 3) # 38400 baud
port_yaz8(SERI + 1, 0)
port_yaz8(SERI + 3, 3) # 8 bit, eşliksiz, 1 dur biti
port_yaz8(SERI + 2, 199) # FIFO
port_yaz8(SERI + 4, 11)
fonksiyon seri_bayt(b):
iken port_oku8(SERI + 5) % 64 < 32:
devam
port_yaz8(SERI, b)
fonksiyon seri_yaz(m):
i = 0
iken bayt(m, i) != 0:
seri_bayt(bayt(m, i))
i = i + 1
seri_bayt(10)
fonksiyon ekran_temizle(renk):
dongu i icinde 0..80 * 25 - 1:
bellek_yaz16(VGA + i * 2, renk * 256 + 32)
fonksiyon ekrana_yaz_konum(m, satir, sutun, renk):
i = 0
iken bayt(m, i) != 0:
bellek_yaz16(VGA + (satir * GENISLIK + sutun + i) * 2, renk * 256 + bayt(m, i))
i = i + 1
fonksiyon ekrana_yaz(m, satir, renk):
ekrana_yaz_konum(m, satir, 0, renk)
fonksiyon sayi_yaz(n, satir, sutun, renk):
# Ondalık yazım: `//` ve `%` yalın kipte IR içinde tanımlıdır.
basamaklar = 1
b = n
iken b >= 10:
b = b // 10
basamaklar = basamaklar + 1
dongu k icinde 0..basamaklar - 1:
rakam = (n // us10(basamaklar - 1 - k)) % 10
bellek_yaz16(VGA + (satir * GENISLIK + sutun + k) * 2, renk * 256 + 48 + rakam)
fonksiyon us10(k):
s = 1
dongu j icinde 1..k:
s = s * 10
don s
seri_hazirla()
seri_yaz("Merhaba, KabaLang! (cekirdek uzun kipte, seri port)")
# Mavi arka plan ve çerçeve
MAVI_ZEMIN = 0x10
ekran_temizle(MAVI_ZEMIN)
# Çerçeve ve Başlık
ekrana_yaz_konum("+----------------------------------------------------------------------------+", 1, 1, 0x1B)
ekrana_yaz_konum("| KabaLang Minimal Kernel -- x86-64, KabaLang ile yazildi |", 2, 1, 0x1F)
ekrana_yaz_konum("+----------------------------------------------------------------------------+", 3, 1, 0x1B)
# Durum Maddeleri
ekrana_yaz_konum("[OK]", 5, 3, 0x1A)
ekrana_yaz_konum("x86-64 Uzun Kip (64-bit Long Mode) Aktif", 5, 8, 0x1F)
ekrana_yaz_konum("[OK]", 7, 3, 0x1A)
ekrana_yaz_konum("Calisma zamani yok: libc yok, yalniz KabaLang + LLVM", 7, 8, 0x1F)
ekrana_yaz_konum("[OK]", 9, 3, 0x1A)
ekrana_yaz_konum("Multiboot ile acilis, ilk 1 GB birebir eslenmis sayfalar", 9, 8, 0x1F)
ekrana_yaz_konum("[OK]", 11, 3, 0x1A)
ekrana_yaz_konum("Hesap: 1..10 kare toplami =", 11, 8, 0x1F)
toplam = 0
dongu i icinde 1..10:
toplam = toplam + i * i
sayi_yaz(toplam, 11, 36, 0x1E)
ekrana_yaz_konum("[OK]", 13, 3, 0x1A)
ekrana_yaz_konum("COM1 seri port (0x3F8) ve VGA 80x25 metin ekrani", 13, 8, 0x1F)
# Alt Bilgi Çerçevesi
ekrana_yaz_konum("+----------------------------------------------------------------------------+", 16, 1, 0x1B)
ekrana_yaz_konum("| DURUM: cekirdek hazir; seri porta ve VGA metin ekranina yaziyor. |", 17, 1, 0x1E)
ekrana_yaz_konum("| NOT : Cekirdek mantiginin tamami KabaLang ile yazilmis, LLVM ile yerel |", 18, 1, 0x17)
ekrana_yaz_konum("| 64-bit ELF makine ikilisine derlenmistir. |", 19, 1, 0x17)
ekrana_yaz_konum("+----------------------------------------------------------------------------+", 20, 1, 0x1B)
ekrana_yaz_konum(">> Cekirdek isini bitirdi, islemci durduruldu.", 22, 3, 0x1E)
seri_yaz("VGA yazildi; cekirdek durduruluyor.")
dur()