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.
85 lines
2.0 KiB
Plaintext
85 lines
2.0 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/.
|
|
#
|
|
# Asal sayılar: çekirdek 2..1000 arasındaki asalları bulur, ekrana bir
|
|
# tablo olarak, seri porta da toplam olarak yazar.
|
|
|
|
VGA = 0xB8000
|
|
SERI = 0x3F8
|
|
|
|
fonksiyon seri_bayt(b):
|
|
iken bit_ve(port_oku8(SERI + 5), 0x20) == 0:
|
|
devam
|
|
port_yaz8(SERI, b)
|
|
|
|
fonksiyon seri_yaz(m):
|
|
i = 0
|
|
iken bayt(m, i) != 0:
|
|
seri_bayt(bayt(m, i))
|
|
i = i + 1
|
|
|
|
fonksiyon hucre(satir, sutun, karakter, renk):
|
|
bellek_yaz16(VGA + (satir * 80 + sutun) * 2, renk * 256 + karakter)
|
|
|
|
fonksiyon yaz(m, satir, sutun, renk):
|
|
i = 0
|
|
iken bayt(m, i) != 0:
|
|
hucre(satir, sutun + i, bayt(m, i), renk)
|
|
i = i + 1
|
|
|
|
fonksiyon basamak_sayisi(n):
|
|
b = 1
|
|
iken n >= 10:
|
|
n = n // 10
|
|
b = b + 1
|
|
don b
|
|
|
|
fonksiyon sayi(n, satir, sutun, renk):
|
|
# Sağa yaslı değil, soldan yazar; kaç basamak yazıldığını döner.
|
|
b = basamak_sayisi(n)
|
|
k = b - 1
|
|
iken k >= 0:
|
|
hucre(satir, sutun + k, 0x30 + n % 10, renk)
|
|
n = n // 10
|
|
k = k - 1
|
|
don b
|
|
|
|
fonksiyon seri_sayi(n):
|
|
eger n >= 10:
|
|
seri_sayi(n // 10)
|
|
seri_bayt(0x30 + n % 10)
|
|
|
|
fonksiyon asal_mi(n):
|
|
eger n < 2:
|
|
don yanlis
|
|
d = 2
|
|
iken d * d <= n:
|
|
eger n % d == 0:
|
|
don yanlis
|
|
d = d + 1
|
|
don dogru
|
|
|
|
dongu i icinde 0..80 * 25 - 1:
|
|
bellek_yaz16(VGA + i * 2, 0x0F20)
|
|
yaz("Asal sayilar (2..1000) -- KabaLang cekirdegi", 0, 2, 0x0E)
|
|
|
|
satir = 2
|
|
sutun = 2
|
|
adet = 0
|
|
dongu n icinde 2..1000:
|
|
eger asal_mi(n):
|
|
adet = adet + 1
|
|
sayi(n, satir, sutun, 0x0A)
|
|
sutun = sutun + 5
|
|
eger sutun > 74:
|
|
sutun = 2
|
|
satir = satir + 1
|
|
|
|
yaz("Toplam:", satir + 2, 2, 0x0F)
|
|
sayi(adet, satir + 2, 10, 0x0E)
|
|
seri_yaz("2..1000 arasinda asal sayi adedi: ")
|
|
seri_sayi(adet)
|
|
seri_bayt(10)
|
|
dur()
|