Commodore sayı 36, sayfa 51

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 51

seti okunurken bellek dağılımı

—> Normal durumda bellek dağılımı | H H H | RAM Karakter seti RAM LA 1 > (RAM —m” kumanda İşletim sistemi | | 0 40960 49152 53248 57344 65535 işlemler kat kat hızlı gerçekleşmektedir. Fakat biz burada kullanılan makine dili rutinlerini daha yakından incelemeyeceğiz. Şu ana kadar ASCII kodlarının nasıl hesaplandığını gördük fakat asıl karakterler ekrana gelene kadar birçok adımla daha karşılaşacağız. Bu adımlardan ilki ise ASC kodlarının ekran kodlarına dönüştürülmesidir. Bu dönüşüm sadece ve sadece Commodore bilgisayarında yapılır. Bunun nedenini şöyle açıklayabiliriz: Bilgisayarda maksimum 256 ASCII kodu mevcuttur, fakat bu 256 kodun her biri için ekranda bir işaret gösterilemez. Örneğin RETURN, fonksiyon veya cursor kontrol tuşlarını düşünün. Bunların her biri ayrı ayrı işlevlere sahiptirler fakat ekranda bir karakter ile gösterilmezler. Mümkün olduğu kadar çok karakterin ekranda gözükebilmesi için (en fazla 256) işlevi olan fakat ekranda gösterilmeyen ASCII kodları elenip yeni bir tabela düzenlenmelidir. ASCII tabelasında olduğu gibi 64. sırada bulunmaz. Ekran gösterim kodlarının bulunduğu tabelada bu sefer en başta yani sıfırıncı sırada yer alır. Aslında ASCII tabelasının tekrar düzenlenmesinin başka sebepleri de vardır. Ekran gösterim kodlarının Videocontroller (VIC)'ın gösterilecek karakterleri oluşturma şekli ile yakından ilişkisi vardır. Ekranda gösterilen tüm işaretlere ait bilgiler bir ROM (Read Only Memory-Sadece okunabilir bellek)'de kayıtlıdır. Bu ROM'da karakterler bir bütün halinde yer almazlar; herhangi bir şekilde olmaları lazımdır. Ekranda gösterilen her işaret 8x8 noktadan oluştuğu için her satırda 8 nokta bulunmaktadır. (Resim 1) Her karakterin bir satırında bulunan noktaların konumu 0 ile 255 arası bir sayı ile belirlenir. Bu nedenle bir işaret için gerekli olan 8 satır ROM'un belleğinde arka arkaya bulunur. Örnek olarak ROM belleğinin 0 ile 7 arası baytları, <A> harfi ile 8 ile 15 arası baytları kaplar. Eğer bilgisayar ekranda <A> harfinin gelmesini isterse videocontroller'a “1” sayısını bildirir. Videocontroller bu durumda karakterlerin şeklinin kayıtlı olduğu ROM'dan 1 no'lu karakteri alır ve ekranda gösterir. Şimdi kontrol tuşları aradan çıkartıldıktan sonra ASCII tabelasının neden yeni baştan organize edildiğini sorabilirsiniz. Eğer eski tabela kullanılsa idi çıkarılan kodların yerleri boş kalacaktı ve lüzumsuz yere hafıza kaybına neden olacaktı. Şu anda C-64'ün tüm karakterleri hafızada sadece 4096 bayt işgal etmektedir. Daha önce belirtildiği gibi bir işaret için 8 bayt kullanılır. Toplam 256 işaret olduğundan 256 x 8 = 2048 bayt kullanılır. Küçük ve büyük harfler için ayrı ayrı karakter setleri bulunduğu için bu toplam 4096 bayt yapar. Zaten ROM'un kapasitesi de daha fazla değildir. Şu ana kadar Videocontroller'in bir işareti ekrana getirirken neler yaptığını gördük, fakat eğer ekran tamamıyla dolarsa ne olacak? Bu durumda bilgisayarın belleğinde tüm ekranın kayıtlı olduğu ve videocontroller tarafından sürekli okunan bir alan mevcuttur ve 1024 ile 2023. adresler arasında bulunur. Burada ekran yine ekran gösterim kodları ile kaydedilir. Denemek için şu satırı yazabilirsiniz:

Belleğin 1. baytı, C-64'ün karakter setini veya videocontroller'in kumanda adreslerini görmesini sağlar.

PRINT “ CLR POKE 1024,1 RETURN

Tahmin ettiğiniz gibi ekranın sol üst köşesinde A harfi görülecektir. Aynı şeyi ekranın sağ alt köşesine de uygulayabilirsiniz:

PRİNT “ CLR ”: POKE 2033,1 RETURN

Şimdi tüm yukarıda anlatılanları gösteren bir BASIC-Demo göreceğiz. Fakat programın listesini incelemeye başlamadan bazı ek bilgiler verelim. Bir işaretin biçiminin karakter ROM'unda bulunabilmesi için o işaretin ekran gösterim kodu 8 ile çarpılır. Bu cümle tamamıyla doğrudur fakat yeterli değildir. Zira karakterler bilgisayarın belleğinde 53248. adresten itibaren yer alır. Bu nedenle daha önce elde ettiğimiz çarpımı bu sayıya ilave etmeliyiz. İnceleyeceğimiz küçük demoda daha başka sorunlarla da karşılaşıyoruz. Öncelikle BASIC'ten karakter ROM'unu doğrudan doğruya okutamayız zira bu alanda Videocontroller'in kumanda adresleri ve Soundcontroller yer almaktadır. Resim 2'de bunu daha detaylı olarak görebilirsiniz. Yukarıda belirtilen sorunun giderilmesinde C-64'de bir demiryolu makası gibi çalışan 1. adres kullanılır. Bu adresin aldığı değere göre C-64 karakter setini veya videocontroller'ın kumanda adreslerini algılar. Fakat burada C-64 oldukça gereksiz bir şekilde karakter setini okurken işletim sistemini otomatik olarak devreden çıkartır. Bu durumda bilgisayar klavyeden yazılmış hiçbir şeyi algılayamaz. BASIC'den karakter ROM'unun okunması bu şekilde olanaksız hale geldiği için ufak bir makine dili program yazılmalıdır ve demoda bu alt program 32000. satırda yer almaktadır. Şimdi BASIC-Demo'muzu incelemeye başlayalım. İlk satır demonun işleyişi ile ilgili değildir. Burada DATA'lar halinde 32000. satırda bulunan makine dili programı hafızaya yerleştirilir. 20. satırda BA değişkenine üçüncü 32, dördüncü 16, beşinci 8, altıncı 4, yedinci 2 ve en sağdaki 1 olsun. Herhalde bunların üstel olduğunu fark etmişsinizdir.

Klavyeyle gezinmek için ← ve → tuşları.