Bu sayfadaki yazılar
Sayfanın metni
Sayfa 19
Belki fark etmişsinizdir, oyunlarda ve bazı programlarda yazılar değişik bir şekildedir ve C64'ün alışık olduğunuz karakterlerinden çok farklıdır. Peki bu nasıl oluyor? Cevabı ise karakter seti değiştiriliyor olacaktır. Cevap bu kadar basittir ama o karakter setini hazırlamak biraz emek ister. En basitinden değişik bir "1x1" karakter seti hazırlamak için önce bir yerlerden "FONT EDİTÖR" olarak bilinen utility'lerden bulacaksınız ve elinize bir joystick alıp her karakteri baştan çizeceksiniz. Eğer eliniz (benim gibi :)) grafiğe yatkın değilse 4096 byte'ı yeniden düzenlemek tam bir işkence olacaktır. Eğer sadece rakamları, harfleri ve noktalama işaretlerini yeniden çizecekseniz işiniz biraz daha kısa sürecektir. Bu arada C64'te karakterler hafızada nerede ve ne şekilde duruyor kısa bir bilgi verelim.
C64'ün karakter seti $D000-$DFFF adresleri arasında bulunan KARAKTER ROM'da saklanmaktadır. Derginin önceki sayılarında verdiğimiz "BELLEK HARİTASI" köşesinde aynı adreslerde "I/O CHİPLERİ" ve 4K'lık bir RAM vardır. C64 mühendisleri öyle bir sistem tasarlamışlar ki C64'ün ilk açılıştaki konfigürasyonunda CPU $D000-$DFFF adreslerindeki "I/O" çiplerine erişebilirken, "karakter rom"a sadece, C64'ün grafik çipi VIC-II erişebilmektedir. Burada bir çelişki var gibi gözükmektedir. Şöyle ki, VIC-II'nin kendisi $D000-$D3FF adresleri arasında, Karakter Rom'u da $D000-$DFFF adresleri arasındadır. Yani bir tür adres çakışması vardır. Fakat bizim mühendisler bir hile yaparak karakter setini VIC-II'ye $1000-$1FFF adresleri arasındaymış gibi göstermişlerdir. Oysa gerçekte bu adresler tamamen kullanıcıya kalmıştır. Yani siz $1000-$1FFF arasını kullanarak karakter setini değiştiremezsiniz. VIC-II çipi 16K'lık bir belleğe erişebilir ve bu 16K'lık bölgelere BANK denir. C64'ün belleği 64K olduğu için toplam 4 adet BANK'ımız vardır ve BANK 0, BANK 1, BANK 2 ve BANK 3 olarak adlandırılır. C64 ilk açılışta $0000-$3FFF (BANK 0) arasını kullanır. Karakter Rom'u normalde $C000-$FFFF adresleri arasındaki BANK 3'ün adreslerinin bir kısmını ($D000-$DFFF) kullanmaktadır. İşte bu $D000-$DFFF adresleri BANK 0'daki $1000-$1FFF adreslerine karşılık gelmektedir ve ROM GÖRÜNTÜSÜ olarak adlandırılmaktadır. Şimdi gelelim karakterlerin hafızada ne şekilde saklandıklarına.
Normal bir karakter seti 256 karakterden oluşur ve her karakter 8 byte'lık yer kaplar. Böylece 256*8=2048 byte bir karakter setinin kaplayacağı alandır. Fakat Karakter Rom'u 4096 Byte'tır. Yani C64'ün aslında 2 tane karakter seti vardır. C64 açılışta $D000-$D7FF adresler arasındaki ilk seti kullanır. İkinci set ise $D800-$DFFF adresleri arasındadır ve setler arasındaki geçiş "SHIFT" ve
"C=" (Commodore) tuşlarıyla yapılır. Hangi karakterler hangi adreslerde olduğunu öğrenmek istiyorsanız tablo-1 işinize yarayacaktır.
Sırada ise yeni oluşturduğumuz karakter setini C64'e nasıl bildireceğiz sorusunun cevabı var. Bir karakter setinin 256 karakterden oluştuğunu ve 2048 byte (2K) yer kapladığını biliyoruz. Bu durumda bir karakter seti BANK içinde 8 farklı adresten başlayabilir. İster bütün karakterleri, isterseniz sadece bir karakteri değiştirin karakter setiniz mutlaka 8 adresin birinden başlamak zorundadır. Yani kafanıza göre adres kullanamazsınız. Karakter setinin yerini $D018 (53272) adresindeki VIC-II kontrol registerinin 3 bit'i belirler. Bit 3, 2 ve 1 2K'lık bloklar halinde, karakter setinin nerede olduğunu belirler. Bit 0 dikkate alınmaz. Tablo-2'de karakter setinin yerleşebileceği adresleri bulabilirsiniz.
Tablo-2, BANK 0 için kullanılabilecek adresleri göstermektedir. Her ne kadar 8 adet yerimiz var gibi gözükse de $0000 - $07FF, $1000 - $17FF ve $1800 - $1FFF adreslerini kullanamıyoruz. $0000 - $07FF arası bölgenin $0000 - $03FF arasındaki kısmında işletim sistemi tarafından kullanılan sistem değişkenleri, mikro işlemci tarafından kullanılan STACK (Yığın) ve vektör adresleri vs. bulunmaktadır. $0400 - $07FF arası ise ekran belleği olarak kullanılmaktadır. Dolayısıyla $0000 - $07FF arasını, eğer bana işletim sistemi lazım değil, ekran belleğini de başka bir yere taşırım derseniz belki kullanabilirsiniz. Belki diyorum çünkü özellikle $0100 - $01FF arasındaki STACK denilen bölgenin içeriğini değiştirdiğiniz anda programınızın çalışması bozulabilir, C64 kilitlenebilir. Nedeni ise -hatta kendi işletim sisteminizi yazmış bile olsanız- STACK denilen bölgenin mikro işlemci tarafından mutlaka kullanılan bir bölge olmasıdır. Kısaca tablodaki ilk adresleri unutun.
Diğer adreslerden $1000 - $17FF ve $1800 - $1FFF arası ise daha önce bahsetmiş olduğumuz ROM GÖRÜNTÜSÜ adresleri olup bu adreslere yeni karakter setinizi yerleştirip $D018'e uygun değeri verseniz bile C64'ün kendi karakterlerini görürsünüz. Daha farklı bir ifadeyle POKE 53272,20 komutu ile C64'ün normal karakter setini seçmiş olursunuz. Örnek karakter setimizle ilgili programı incelerseniz $D018'e $1C değerini verdiğimizi görebilirsiniz.
Karakterlerin Rom'daki sıralanışı karakterlerin ekran koduna göredir. Örnek verecek olursak "A" karakterinin ekran kodu "1" olup Rom'da $D008 - $D00F adresleri arasındadır. Bir karakter 8 byte yer kaplamaktadır. Bu durumda bir karakterin Rom'daki adresi şöyle bulunur.
ADRES = $D000 + KARAKTERİN EKRAN KODU * 8
Eğer karakter setiniz Ram'de ise formüldeki $D000 yerine karakter setinin Ram'deki başlangıç adresini yazmanız yeterli olacaktır.
Bir byte'ın toplam değeri dolu olan bitlerin "bit değeri" toplanarak bulunur. Bir karakter 8 byte olduğuna göre bütün byte'lar hesaplanarak karakterin hafıza adresine POKE komutuyla yazılır. Eğer sadece harf, rakam ve noktalama işaretlerini değiştirecekseniz 2K yerine ilk 64 karakteri değiştirmeniz yeterlidir. Son olarak bizim programımızda bütün karakter seti "sağa italik" olarak değiştiriliyor.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 18
LDA #<YAZI LDY #>YAZI JSR $AB1E ... .....
YAZI .TEXT "C64 TURKIYE SAYI 4" .BYTE 0
İlk örneğimizde o anki kursör pozisyonundan itibaren "C64 TURKIYE SAYI 4" yazısı yazılacaktır.
LDA #<YAZI LDY #>YAZI JSR $AB1E ... .....
YAZI .BYTE 147 .TEXT "C64 TURKIYE SAYI 4" .BYTE 0
Bu örnekte ise yine aynı yazıyı yazdırıyoruz fakat daha önceden ekran siliniyor ve yazı en üstten itibaren yazılıyor. "147" sayısı tahmin ettiğiniz gibi ekranı silmeye yarıyor.
ADRES: $A437 GÖREVİ: HATA MESAJINI YAZDIRIR
Bu adresi kullanacağınızı pek sanmıyorum. Çünkü C64 bu adresi ekrana herhangi bir hata mesajı yazdırmak için kullanır. Belki programınızda şaka amaçlı olarak kullanabilirsiniz. Yapmanız gereken X registerine 1 ila 30 arasında (30 hariç) bir sayı yükleyip bu adrese sıçramak olacaktır.
Aşağıdaki örneği kullanarak ekrana "DEVICE NOT PRESENT ERROR" mesajı çıkarabilirsiniz. Bu arada ufak bir not düşelim: Program içinde eğer bu adresi kullanırsanız, ister JSR ister JMP ile $A437'ye gidin, C64 her zaman ekrana "READY" yazarak programdan çıkacaktır. Çünkü, gerçekte hiçbir hata olmamasına rağmen, C64 hata olduğunu zannedip programın çalışmasını durduracaktır.
LDX #$05 JMP $A437 ... .....
ADRES: $FCE2 GÖREVİ: C64 İLK AÇILIŞTAKİ HALİNE DÖNER
Fazla söze gerek yok. Sadece basit bir resetleme işlemi :) Bakınız : SYS 64738
Bir sonraki sayıda buluşabilmek dileğiyle şimdilik bu kadar.