# 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/. # # VGA metin kipi sürücüsü: 80×25, imleç, kaydırma, sayı yazımı, UTF-8 & Türkçe font. VGA = 0xB8000 GENISLIK = 80 YUKSEKLIK = 25 fonksiyon font_cizgi(kod, satir, bayt): bellek_yaz8(0xA0000 + kod * 32 + satir, bayt) fonksiyon glif_temizle(kod): dongu s icinde 0..31: font_cizgi(kod, s, 0) fonksiyon turkce_font_kur(): # VGA Plane 2 (yazı tipi belleği) erişimini aç port_yaz8(0x3C4, 0x02) port_yaz8(0x3C5, 0x04) port_yaz8(0x3C4, 0x04) port_yaz8(0x3C5, 0x07) port_yaz8(0x3CE, 0x05) port_yaz8(0x3CF, 0x00) port_yaz8(0x3CE, 0x06) port_yaz8(0x3CF, 0x00) # 1. ı (0x8D - küçük noktasız ı, otantik IBM CP857) glif_temizle(0x8D) font_cizgi(0x8D, 5, 0x38) font_cizgi(0x8D, 6, 0x18) font_cizgi(0x8D, 7, 0x18) font_cizgi(0x8D, 8, 0x18) font_cizgi(0x8D, 9, 0x18) font_cizgi(0x8D, 10, 0x18) font_cizgi(0x8D, 11, 0x3C) # 2. İ (0x98 - büyük noktalı İ, otantik IBM CP857) glif_temizle(0x98) font_cizgi(0x98, 1, 0x18) font_cizgi(0x98, 3, 0x3C) font_cizgi(0x98, 4, 0x18) font_cizgi(0x98, 5, 0x18) font_cizgi(0x98, 6, 0x18) font_cizgi(0x98, 7, 0x18) font_cizgi(0x98, 8, 0x18) font_cizgi(0x98, 9, 0x18) font_cizgi(0x98, 10, 0x18) font_cizgi(0x98, 11, 0x3C) # 3. ş (0x9F - küçük ş, otantik IBM CP857) glif_temizle(0x9F) font_cizgi(0x9F, 5, 0x7C) font_cizgi(0x9F, 6, 0xC6) font_cizgi(0x9F, 7, 0x60) font_cizgi(0x9F, 8, 0x38) font_cizgi(0x9F, 9, 0x0C) font_cizgi(0x9F, 10, 0xC6) font_cizgi(0x9F, 11, 0x7C) font_cizgi(0x9F, 12, 0x18) font_cizgi(0x9F, 13, 0x30) # 4. Ş (0x9E - büyük Ş, otantik IBM CP857) glif_temizle(0x9E) font_cizgi(0x9E, 2, 0x7C) font_cizgi(0x9E, 3, 0xC6) font_cizgi(0x9E, 4, 0xC6) font_cizgi(0x9E, 5, 0x60) font_cizgi(0x9E, 6, 0x38) font_cizgi(0x9E, 7, 0x0C) font_cizgi(0x9E, 8, 0x06) font_cizgi(0x9E, 9, 0xC6) font_cizgi(0x9E, 10, 0xC6) font_cizgi(0x9E, 11, 0x7C) font_cizgi(0x9E, 12, 0x18) font_cizgi(0x9E, 13, 0x30) # 5. ğ (0xA7 - küçük yumuşak ğ, otantik IBM CP857) glif_temizle(0xA7) font_cizgi(0xA7, 2, 0xCC) font_cizgi(0xA7, 3, 0x78) font_cizgi(0xA7, 5, 0x76) font_cizgi(0xA7, 6, 0xCC) font_cizgi(0xA7, 7, 0xCC) font_cizgi(0xA7, 8, 0xCC) font_cizgi(0xA7, 9, 0xCC) font_cizgi(0xA7, 10, 0xCC) font_cizgi(0xA7, 11, 0x7C) font_cizgi(0xA7, 12, 0x0C) font_cizgi(0xA7, 13, 0xCC) font_cizgi(0xA7, 14, 0x78) # 6. Ğ (0xA6 - büyük yumuşak Ğ, otantik IBM CP857) glif_temizle(0xA6) font_cizgi(0xA6, 1, 0x66) font_cizgi(0xA6, 2, 0x7E) font_cizgi(0xA6, 3, 0x3C) font_cizgi(0xA6, 4, 0x66) font_cizgi(0xA6, 5, 0xC2) font_cizgi(0xA6, 6, 0xC0) font_cizgi(0xA6, 7, 0xC0) font_cizgi(0xA6, 8, 0xDE) font_cizgi(0xA6, 9, 0xC6) font_cizgi(0xA6, 10, 0x6E) font_cizgi(0xA6, 11, 0x3A) # 7. ç (0x87 - küçük ç, otantik IBM CP857) glif_temizle(0x87) font_cizgi(0x87, 5, 0x7C) font_cizgi(0x87, 6, 0xC6) font_cizgi(0x87, 7, 0xC0) font_cizgi(0x87, 8, 0xC0) font_cizgi(0x87, 9, 0xC0) font_cizgi(0x87, 10, 0xC6) font_cizgi(0x87, 11, 0x7C) font_cizgi(0x87, 12, 0x18) font_cizgi(0x87, 13, 0x30) # 8. Ç (0x80 - büyük Ç, otantik IBM CP857) glif_temizle(0x80) font_cizgi(0x80, 2, 0x3C) font_cizgi(0x80, 3, 0x66) font_cizgi(0x80, 4, 0xC2) font_cizgi(0x80, 5, 0xC0) font_cizgi(0x80, 6, 0xC0) font_cizgi(0x80, 7, 0xC0) font_cizgi(0x80, 8, 0xC0) font_cizgi(0x80, 9, 0xC2) font_cizgi(0x80, 10, 0x66) font_cizgi(0x80, 11, 0x3C) font_cizgi(0x80, 12, 0x18) font_cizgi(0x80, 13, 0x30) # 9. ö (0x94 - küçük ö, otantik IBM CP857) glif_temizle(0x94) font_cizgi(0x94, 2, 0xC6) font_cizgi(0x94, 5, 0x7C) font_cizgi(0x94, 6, 0xC6) font_cizgi(0x94, 7, 0xC6) font_cizgi(0x94, 8, 0xC6) font_cizgi(0x94, 9, 0xC6) font_cizgi(0x94, 10, 0xC6) font_cizgi(0x94, 11, 0x7C) # 10. Ö (0x99 - büyük Ö, otantik IBM CP857) glif_temizle(0x99) font_cizgi(0x99, 1, 0xC6) font_cizgi(0x99, 3, 0x7C) font_cizgi(0x99, 4, 0xC6) font_cizgi(0x99, 5, 0xC6) font_cizgi(0x99, 6, 0xC6) font_cizgi(0x99, 7, 0xC6) font_cizgi(0x99, 8, 0xC6) font_cizgi(0x99, 9, 0xC6) font_cizgi(0x99, 10, 0xC6) font_cizgi(0x99, 11, 0x7C) # 11. ü (0x81 - küçük ü, otantik IBM CP857) glif_temizle(0x81) font_cizgi(0x81, 2, 0xCC) font_cizgi(0x81, 5, 0xCC) font_cizgi(0x81, 6, 0xCC) font_cizgi(0x81, 7, 0xCC) font_cizgi(0x81, 8, 0xCC) font_cizgi(0x81, 9, 0xCC) font_cizgi(0x81, 10, 0xCC) font_cizgi(0x81, 11, 0x76) # 12. Ü (0x9A - büyük Ü, otantik IBM CP857) glif_temizle(0x9A) font_cizgi(0x9A, 1, 0xC6) font_cizgi(0x9A, 3, 0xC6) font_cizgi(0x9A, 4, 0xC6) font_cizgi(0x9A, 5, 0xC6) font_cizgi(0x9A, 6, 0xC6) font_cizgi(0x9A, 7, 0xC6) font_cizgi(0x9A, 8, 0xC6) font_cizgi(0x9A, 9, 0xC6) font_cizgi(0x9A, 10, 0xC6) font_cizgi(0x9A, 11, 0x7C) # Standart metin kipine geri dön port_yaz8(0x3C4, 0x02) port_yaz8(0x3C5, 0x03) port_yaz8(0x3C4, 0x04) port_yaz8(0x3C5, 0x03) port_yaz8(0x3CE, 0x04) port_yaz8(0x3CF, 0x00) port_yaz8(0x3CE, 0x05) port_yaz8(0x3CF, 0x10) port_yaz8(0x3CE, 0x06) port_yaz8(0x3CF, 0x0E) fonksiyon hucre(satir, sutun, karakter, renk): bellek_yaz16(VGA + (satir * GENISLIK + sutun) * 2, renk * 256 + karakter) fonksiyon imleci_tasi(satir, sutun): konum = satir * GENISLIK + sutun port_yaz8(0x3D4, 0x0F) port_yaz8(0x3D5, bit_ve(konum, 0xFF)) port_yaz8(0x3D4, 0x0E) port_yaz8(0x3D5, bit_ve(saga_kaydir(konum, 8), 0xFF)) fonksiyon konumlandir(satir, sutun): bellek_yaz64(durum.SATIR, satir) bellek_yaz64(durum.SUTUN, sutun) imleci_tasi(satir, sutun) fonksiyon temizle(renk): dongu i icinde 0..GENISLIK * YUKSEKLIK - 1: bellek_yaz16(VGA + i * 2, renk * 256 + 0x20) konumlandir(0, 0) bellek_yaz64(durum.RENK, renk) fonksiyon renk(r): bellek_yaz64(durum.RENK, r) fonksiyon kaydir(): dongu i icinde 0..GENISLIK * (YUKSEKLIK - 1) - 1: bellek_yaz16(VGA + i * 2, bellek_oku16(VGA + (i + GENISLIK) * 2)) r = bellek_oku64(durum.RENK) dongu s icinde 0..GENISLIK - 1: hucre(YUKSEKLIK - 1, s, 0x20, r) fonksiyon alt_satir(): bellek_yaz64(durum.SUTUN, 0) satir = bellek_oku64(durum.SATIR) + 1 eger satir >= YUKSEKLIK: kaydir() satir = YUKSEKLIK - 1 bellek_yaz64(durum.SATIR, satir) fonksiyon karakter(c): eger c == 0x0A: alt_satir() degilse: hucre(bellek_oku64(durum.SATIR), bellek_oku64(durum.SUTUN), c, bellek_oku64(durum.RENK)) sutun = bellek_oku64(durum.SUTUN) + 1 bellek_yaz64(durum.SUTUN, sutun) eger sutun >= GENISLIK: alt_satir() imleci_tasi(bellek_oku64(durum.SATIR), bellek_oku64(durum.SUTUN)) fonksiyon geri_sil(): sutun = bellek_oku64(durum.SUTUN) eger sutun > 0: bellek_yaz64(durum.SUTUN, sutun - 1) hucre(bellek_oku64(durum.SATIR), sutun - 1, 0x20, bellek_oku64(durum.RENK)) imleci_tasi(bellek_oku64(durum.SATIR), sutun - 1) fonksiyon turkce_kod(b, b2): eger b == 0xC3: eger b2 == 0xA7: don 0x87 # ç eger b2 == 0x87: don 0x80 # Ç eger b2 == 0xB6: don 0x94 # ö eger b2 == 0x96: don 0x99 # Ö eger b2 == 0xBC: don 0x81 # ü eger b2 == 0x9C: don 0x9A # Ü degilse eger b == 0xC4: eger b2 == 0x9F: don 0xA7 # ğ eger b2 == 0x9E: don 0xA6 # Ğ eger b2 == 0xB1: don 0x8D # ı eger b2 == 0xB0: don 0x98 # İ degilse eger b == 0xC5: eger b2 == 0x9F: don 0x9F # ş eger b2 == 0x9E: don 0x9E # Ş don 0 fonksiyon utf8_uc_bayt(b1, b2, b3): eger b1 == 0xE2: eger b2 == 0x94: eger b3 == 0x80: don 0xC4 # ─ (tek yatay çizgi) eger b3 == 0x82: don 0xB3 # │ (tek dikey çizgi) eger b3 == 0x8C: don 0xDA # ┌ eger b3 == 0x90: don 0xBF # ┐ eger b3 == 0x94: don 0xC0 # └ eger b3 == 0x98: don 0xD9 # ┘ eger b3 == 0x9C: don 0xC3 # ├ eger b3 == 0xA4: don 0xB4 # ┤ eger b3 == 0xAC: don 0xC2 # ┬ eger b3 == 0xB4: don 0xC1 # ┴ eger b3 == 0xBC: don 0xC5 # ┼ degilse eger b2 == 0x95: eger b3 == 0x90: don 0xCD # ═ (çift yatay çizgi) eger b3 == 0x91: don 0xBA # ║ (çift dikey çizgi) eger b3 == 0x94: don 0xC9 # ╔ (çift sol üst köşe) eger b3 == 0x97: don 0xBB # ╗ (çift sağ üst köşe) eger b3 == 0x9A: don 0xC8 # ╚ (çift sol alt köşe) eger b3 == 0x9D: don 0xBC # ╝ (çift sağ alt köşe) eger b3 == 0xA6: don 0xCB # ╦ (çift üst birleşim) eger b3 == 0xA9: don 0xCA # ╩ (çift alt birleşim) eger b3 == 0xAC: don 0xCE # ╬ (çift artı) degilse eger b2 == 0x96: eger b3 == 0x88: don 0xDB # █ (dolu blok) eger b3 == 0x91: don 0xB0 # ░ (açık gölge) eger b3 == 0x92: don 0xB1 # ▒ (orta gölge) eger b3 == 0x93: don 0xB2 # ▓ (koyu gölge) degilse eger b2 == 0x80: eger b3 == 0x93: don 0x2D # – (en dash) eger b3 == 0x94: don 0xC4 # — (em dash) eger b3 == 0x98 veya b3 == 0x99: don 0x27 # ’ ' eger b3 == 0x9C veya b3 == 0x9D: don 0x22 # “ ” eger b3 == 0xA2: don 0x07 # • (madde imi) don 0 fonksiyon glif(cp): # Unicode kod noktası → VGA glif kodu (ASCII + Türkçe harfler, CP857 yerleşimi). eger cp < 0x80: don cp eger cp == 0xE7: don 0x87 # ç eger cp == 0xC7: don 0x80 # Ç eger cp == 0xF6: don 0x94 # ö eger cp == 0xD6: don 0x99 # Ö eger cp == 0xFC: don 0x81 # ü eger cp == 0xDC: don 0x9A # Ü eger cp == 0x11F: don 0xA7 # ğ eger cp == 0x11E: don 0xA6 # Ğ eger cp == 0x131: don 0x8D # ı eger cp == 0x130: don 0x98 # İ eger cp == 0x15F: don 0x9F # ş eger cp == 0x15E: don 0x9E # Ş don 0x3F # ? fonksiyon kod_noktasi(cp): # Klavyeden gelen kod noktasını ekrana yazar. karakter(glif(cp)) fonksiyon yaz(m): i = 0 iken bayt(m, i) != 0: b = bayt(m, i) eger b < 0x80: karakter(b) i = i + 1 degilse eger b >= 0xC0 ve b < 0xE0: b2 = bayt(m, i + 1) eger b2 == 0: don 0 k = turkce_kod(b, b2) eger k != 0: karakter(k) degilse: karakter(0x3F) i = i + 2 degilse eger b >= 0xE0 ve b < 0xF0: b2 = bayt(m, i + 1) eger b2 == 0: don 0 b3 = bayt(m, i + 2) eger b3 == 0: don 0 k = utf8_uc_bayt(b, b2, b3) eger k != 0: karakter(k) degilse: karakter(0x3F) i = i + 3 degilse: # 4 baytlık UTF-8 veya bilinmeyen sekans karakter(0x3F) i = i + 1 fonksiyon satir(m): yaz(m) karakter(0x0A) fonksiyon yaz_konum(satir, sutun, m, r): eski_satir = bellek_oku64(durum.SATIR) eski_sutun = bellek_oku64(durum.SUTUN) eski_renk = bellek_oku64(durum.RENK) konumlandir(satir, sutun) renk(r) yaz(m) konumlandir(eski_satir, eski_sutun) renk(eski_renk) fonksiyon satir_doldur(satir, ch, r): dongu col icinde 0..GENISLIK - 1: hucre(satir, col, ch, r) fonksiyon yatay_cizgi(satir, sol, gen, r): dongu c icinde sol..sol + gen - 1: hucre(satir, c, 0xC4, r) fonksiyon cerceve(ust, sol, gen, yuk, r): # Çift çizgili donanımsal VGA çerçeve (0xC9, 0xCD, 0xBB, 0xBA, 0xC8, 0xBC) hucre(ust, sol, 0xC9, r) hucre(ust, sol + gen - 1, 0xBB, r) hucre(ust + yuk - 1, sol, 0xC8, r) hucre(ust + yuk - 1, sol + gen - 1, 0xBC, r) dongu c icinde sol + 1..sol + gen - 2: hucre(ust, c, 0xCD, r) hucre(ust + yuk - 1, c, 0xCD, r) dongu s icinde ust + 1..ust + yuk - 2: hucre(s, sol, 0xBA, r) hucre(s, sol + gen - 1, 0xBA, r) fonksiyon dikey_ayrac(ust, alt, sutun, r): hucre(ust, sutun, 0xCB, r) dongu s icinde ust + 1..alt - 1: hucre(s, sutun, 0xBA, r) hucre(alt, sutun, 0xCA, r) fonksiyon sayi(n): eger n < 0: karakter(0x2D) n = 0 - n bolen = 1 iken n // bolen >= 10: bolen = bolen * 10 iken bolen > 0: karakter(0x30 + (n // bolen) % 10) bolen = bolen // 10 fonksiyon onaltilik(n): yaz("0x") basladi = yanlis dongu i icinde 0..15: rakam = bit_ve(saga_kaydir(n, (15 - i) * 4), 0xF) eger rakam != 0 veya basladi veya i == 15: basladi = dogru eger rakam < 10: karakter(0x30 + rakam) degilse: karakter(0x61 + rakam - 10)