# 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()