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.
319 lines
8.9 KiB
Plaintext
319 lines
8.9 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 yalın çalışma zamanı — KabaLang ile yazılmıştır.
|
|
#
|
|
# Yalın (çıplak donanım) derlemelere kendiliğinden eklenir. Buradaki
|
|
# `kaba_*` adlı işlevler, normal LLVM yolunda C++ çalışma zamanının verdiği
|
|
# C ABI işlevlerinin karşılığıdır; üreteç onları aynı adla dışa açar
|
|
# (işaretçiler burada 64 bit sayı olarak görünür). Böylece metin işlemleri
|
|
# (birleştirme, karşılaştırma, uzunluk, parça…) çekirdekte de normal
|
|
# KabaLang yazımıyla kullanılabilir.
|
|
#
|
|
# Yığın: `yigin_kur(adres, boyut)` ile çekirdeğin verdiği bölge. İlk uyan
|
|
# boş blok kullanılır, büyük blok bölünür; boş blok yoksa bölgenin
|
|
# sonundan ilerlenir. Bellek biterse işlemci durdurulur.
|
|
#
|
|
# Metin düzeni: [sayaç: 8][uzunluk (bayt): 8][baytlar][0]
|
|
# sayaç < 0 → ölümsüz (derleme zamanında gömülen sabit metin).
|
|
# Uzunluk ve indeks KOD NOKTASI üzerinden çalışır (UTF-8).
|
|
|
|
BASLIK = 16 # blok başlığı: [boyut][sonraki]
|
|
METIN_BASLIK = 16 # metin başlığı: [sayaç][uzunluk]
|
|
|
|
# Yığın durumu `yigin_durumu()` adresindedir (önyükleme parçasında 64 bayt).
|
|
BOS_LISTE = 0
|
|
KULLANILAN = 8
|
|
SINIR = 16
|
|
SON = 24
|
|
|
|
# ── yığın ────────────────────────────────────────────────────────────────
|
|
fonksiyon yigin_kur(adres, boyut):
|
|
d = yigin_durumu()
|
|
bellek_yaz64(d + BOS_LISTE, 0)
|
|
bellek_yaz64(d + KULLANILAN, 0)
|
|
bellek_yaz64(d + SINIR, adres)
|
|
bellek_yaz64(d + SON, adres + boyut)
|
|
|
|
fonksiyon yigin_kullanilan():
|
|
don bellek_oku64(yigin_durumu() + KULLANILAN)
|
|
|
|
fonksiyon kaba_ayir(n):
|
|
d = yigin_durumu()
|
|
boyut = bit_ve(n + 15, bit_degil(15)) + BASLIK
|
|
onceki = 0
|
|
blok = bellek_oku64(d + BOS_LISTE)
|
|
iken blok != 0:
|
|
bb = bellek_oku64(blok)
|
|
eger bb >= boyut:
|
|
eger bb - boyut >= 64:
|
|
# Bloğun SONUNDAN kes; kalan parça listede kalır.
|
|
bellek_yaz64(blok, bb - boyut)
|
|
yeni = blok + bb - boyut
|
|
bellek_yaz64(yeni, boyut)
|
|
bellek_yaz64(d + KULLANILAN, bellek_oku64(d + KULLANILAN) + boyut)
|
|
don yeni + BASLIK
|
|
sonraki = bellek_oku64(blok + 8)
|
|
eger onceki == 0:
|
|
bellek_yaz64(d + BOS_LISTE, sonraki)
|
|
degilse:
|
|
bellek_yaz64(onceki + 8, sonraki)
|
|
bellek_yaz64(d + KULLANILAN, bellek_oku64(d + KULLANILAN) + bb)
|
|
don blok + BASLIK
|
|
onceki = blok
|
|
blok = bellek_oku64(blok + 8)
|
|
sinir = bellek_oku64(d + SINIR)
|
|
eger sinir == 0 veya sinir + boyut > bellek_oku64(d + SON):
|
|
dur()
|
|
bellek_yaz64(d + SINIR, sinir + boyut)
|
|
bellek_yaz64(sinir, boyut)
|
|
bellek_yaz64(d + KULLANILAN, bellek_oku64(d + KULLANILAN) + boyut)
|
|
don sinir + BASLIK
|
|
|
|
fonksiyon kaba_serbest(p):
|
|
eger p == 0:
|
|
don 0
|
|
d = yigin_durumu()
|
|
blok = p - BASLIK
|
|
bellek_yaz64(d + KULLANILAN, bellek_oku64(d + KULLANILAN) - bellek_oku64(blok))
|
|
bellek_yaz64(blok + 8, bellek_oku64(d + BOS_LISTE))
|
|
bellek_yaz64(d + BOS_LISTE, blok)
|
|
don 0
|
|
|
|
# ── metin yardımcıları ───────────────────────────────────────────────────
|
|
fonksiyon bayt_uzunluk(m):
|
|
don bellek_oku64(m + 8)
|
|
|
|
fonksiyon veri(m):
|
|
don m + METIN_BASLIK
|
|
|
|
fonksiyon yeni_metin(n):
|
|
m = kaba_ayir(METIN_BASLIK + n + 1)
|
|
bellek_yaz64(m, 1)
|
|
bellek_yaz64(m + 8, n)
|
|
bellek_yaz8(m + METIN_BASLIK + n, 0)
|
|
don m
|
|
|
|
fonksiyon kopyala(hedef, kaynak, n):
|
|
dongu i icinde 0..n - 1:
|
|
bellek_yaz8(hedef + i, bellek_oku8(kaynak + i))
|
|
|
|
fonksiyon devam_bayti_mi(b):
|
|
don bit_ve(b, 0xC0) == 0x80
|
|
|
|
fonksiyon kod_noktasi_ofseti(m, k):
|
|
# k. kod noktasının bayt ofseti; k uzunluğa eşitse bayt uzunluğu.
|
|
n = bayt_uzunluk(m)
|
|
i = 0
|
|
sayac = 0
|
|
iken i < n:
|
|
eger degil devam_bayti_mi(bellek_oku8(veri(m) + i)):
|
|
eger sayac == k:
|
|
don i
|
|
sayac = sayac + 1
|
|
i = i + 1
|
|
don n
|
|
|
|
fonksiyon alt_metin(m, bas, son):
|
|
# [bas, son) bayt aralığından yeni metin.
|
|
r = yeni_metin(son - bas)
|
|
kopyala(veri(r), veri(m) + bas, son - bas)
|
|
don r
|
|
|
|
# ── C ABI karşılıkları (normal yolda kaba_rt.cpp) ────────────────────────
|
|
fonksiyon kaba_m_tut(m):
|
|
eger m != 0 ve bellek_oku64(m) >= 0:
|
|
bellek_yaz64(m, bellek_oku64(m) + 1)
|
|
|
|
fonksiyon kaba_m_birak(m):
|
|
eger m == 0:
|
|
don 0
|
|
s = bellek_oku64(m)
|
|
eger s > 0:
|
|
eger s == 1:
|
|
kaba_serbest(m)
|
|
degilse:
|
|
bellek_yaz64(m, s - 1)
|
|
don 0
|
|
|
|
fonksiyon kaba_m_sabit(p, n):
|
|
r = yeni_metin(n)
|
|
kopyala(veri(r), p, n)
|
|
don r
|
|
|
|
fonksiyon kaba_m_cden(p):
|
|
n = 0
|
|
iken bellek_oku8(p + n) != 0:
|
|
n = n + 1
|
|
don kaba_m_sabit(p, n)
|
|
|
|
fonksiyon kaba_m_birlestir(a, b):
|
|
la = bayt_uzunluk(a)
|
|
lb = bayt_uzunluk(b)
|
|
r = yeni_metin(la + lb)
|
|
kopyala(veri(r), veri(a), la)
|
|
kopyala(veri(r) + la, veri(b), lb)
|
|
don r
|
|
|
|
fonksiyon kaba_m_birlestir_tasi(a, b):
|
|
# Sol taraf geçicidir: sonuç üretilir, sol bırakılır.
|
|
r = kaba_m_birlestir(a, b)
|
|
kaba_m_birak(a)
|
|
don r
|
|
|
|
fonksiyon kaba_m_karsilastir(a, b):
|
|
la = bayt_uzunluk(a)
|
|
lb = bayt_uzunluk(b)
|
|
n = la
|
|
eger lb < n:
|
|
n = lb
|
|
dongu i icinde 0..n - 1:
|
|
x = bellek_oku8(veri(a) + i)
|
|
y = bellek_oku8(veri(b) + i)
|
|
eger x < y:
|
|
don 0 - 1
|
|
eger x > y:
|
|
don 1
|
|
eger la < lb:
|
|
don 0 - 1
|
|
eger la > lb:
|
|
don 1
|
|
don 0
|
|
|
|
fonksiyon kaba_m_esit(a, b):
|
|
eger bayt_uzunluk(a) != bayt_uzunluk(b):
|
|
don 0
|
|
eger kaba_m_karsilastir(a, b) == 0:
|
|
don 1
|
|
don 0
|
|
|
|
fonksiyon kaba_m_uzunluk(m):
|
|
n = bayt_uzunluk(m)
|
|
sayac = 0
|
|
dongu i icinde 0..n - 1:
|
|
eger degil devam_bayti_mi(bellek_oku8(veri(m) + i)):
|
|
sayac = sayac + 1
|
|
don sayac
|
|
|
|
fonksiyon kaba_m_bos_mu(m):
|
|
eger bayt_uzunluk(m) == 0:
|
|
don 1
|
|
don 0
|
|
|
|
fonksiyon kaba_m_sayidan(n):
|
|
eksi = n < 0
|
|
eger eksi:
|
|
n = 0 - n
|
|
basamak = 1
|
|
b = n
|
|
iken b >= 10:
|
|
b = b // 10
|
|
basamak = basamak + 1
|
|
uzun = basamak
|
|
eger eksi:
|
|
uzun = uzun + 1
|
|
r = yeni_metin(uzun)
|
|
eger eksi:
|
|
bellek_yaz8(veri(r), 0x2D)
|
|
k = uzun - 1
|
|
dongu j icinde 1..basamak:
|
|
bellek_yaz8(veri(r) + k, 0x30 + n % 10)
|
|
n = n // 10
|
|
k = k - 1
|
|
don r
|
|
|
|
fonksiyon kaba_m_sayiya(m):
|
|
n = bayt_uzunluk(m)
|
|
i = 0
|
|
eksi = yanlis
|
|
eger n > 0 ve bellek_oku8(veri(m)) == 0x2D:
|
|
eksi = dogru
|
|
i = 1
|
|
sonuc = 0
|
|
iken i < n:
|
|
c = bellek_oku8(veri(m) + i)
|
|
eger c < 0x30 veya c > 0x39:
|
|
don 0
|
|
sonuc = sonuc * 10 + (c - 0x30)
|
|
i = i + 1
|
|
eger eksi:
|
|
don 0 - sonuc
|
|
don sonuc
|
|
|
|
fonksiyon kaba_m_mantiktan(b):
|
|
eger b != 0:
|
|
don kaba_m_cden(veri_adresi("doğru"))
|
|
don kaba_m_cden(veri_adresi("yanlış"))
|
|
|
|
fonksiyon kaba_m_oge(m, i, satir):
|
|
n = kaba_m_uzunluk(m)
|
|
eger i < 0:
|
|
i = i + n
|
|
eger i < 0 veya i >= n:
|
|
dur()
|
|
don alt_metin(m, kod_noktasi_ofseti(m, i), kod_noktasi_ofseti(m, i + 1))
|
|
|
|
fonksiyon kaba_m_parca(m, bas, uzunluk):
|
|
n = kaba_m_uzunluk(m)
|
|
eger bas < 0:
|
|
bas = 0
|
|
eger bas > n:
|
|
bas = n
|
|
son = n
|
|
eger uzunluk >= 0 ve bas + uzunluk < n:
|
|
son = bas + uzunluk
|
|
don alt_metin(m, kod_noktasi_ofseti(m, bas), kod_noktasi_ofseti(m, son))
|
|
|
|
fonksiyon kaba_m_ile_baslar(m, onek):
|
|
lo = bayt_uzunluk(onek)
|
|
eger lo > bayt_uzunluk(m):
|
|
don 0
|
|
dongu i icinde 0..lo - 1:
|
|
eger bellek_oku8(veri(m) + i) != bellek_oku8(veri(onek) + i):
|
|
don 0
|
|
don 1
|
|
|
|
fonksiyon bayt_bul(m, parca):
|
|
lm = bayt_uzunluk(m)
|
|
lp = bayt_uzunluk(parca)
|
|
eger lp == 0:
|
|
don 0
|
|
i = 0
|
|
iken i + lp <= lm:
|
|
tutar = dogru
|
|
j = 0
|
|
iken tutar ve j < lp:
|
|
eger bellek_oku8(veri(m) + i + j) != bellek_oku8(veri(parca) + j):
|
|
tutar = yanlis
|
|
j = j + 1
|
|
eger tutar:
|
|
don i
|
|
i = i + 1
|
|
don 0 - 1
|
|
|
|
fonksiyon kaba_m_icerir(m, parca):
|
|
eger bayt_bul(m, parca) >= 0:
|
|
don 1
|
|
don 0
|
|
|
|
fonksiyon kaba_m_bul(m, parca):
|
|
b = bayt_bul(m, parca)
|
|
eger b < 0:
|
|
don 0 - 1
|
|
# bayt ofsetinden kod noktası dizinine
|
|
sayac = 0
|
|
dongu i icinde 0..b - 1:
|
|
eger degil devam_bayti_mi(bellek_oku8(veri(m) + i)):
|
|
sayac = sayac + 1
|
|
don sayac
|
|
|
|
fonksiyon kaba_m_tekrarla(m, n):
|
|
l = bayt_uzunluk(m)
|
|
eger n < 0:
|
|
n = 0
|
|
r = yeni_metin(l * n)
|
|
dongu k icinde 0..n - 1:
|
|
kopyala(veri(r) + k * l, veri(m), l)
|
|
don r
|