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.
113 lines
4.1 KiB
Plaintext
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()
|