Bu sayfadaki yazılar
Sayfanın metni
Sayfa 25
Profesyonel iş bilgisayarlarının çoğunda cursor tüm karakteri kaplamaz, sadece karakterin altında çizgi olarak görünür. Neden COMMODORE 64'ümüzün de böyle bir cursor'u olmasın?
Küçük programımız bu işi yapıyor. Programı çalıştırdığınızda, bu işin oluşmasını adım adım seyretme imkânı bulacaksınız. Biz burada işin teknik açıklamasını yapalım.
İlk önce yazı karakteri rengi için açık mavi, arka plan rengi için de koyu mavi seçiliyor. İlk satırda gördüğünüz, önce arka plan rengini açık mavi yapıp ekranı silmek sonra da arka plan rengini yeniden değiştirmek, karakterlere ait renk kodlarının saklandığı renk RAM'ını tamamen açık mavinin koduyla doldurmak için kullanılan küçük bir hiledir. Bir FOR... NEXT döngüsü kullanmaktan daha hızlıdır. Ancak bu hile belli bir modelden sonraki COMMODORE 64'lerde değişiklik gösteriyor. Eğer programın gördüğünüz şekilde yazar da bir sonuç alamazsanız, POKE 53281,14 yerine POKE 646,14 yapın. Bu adres, ekrandaki yazı karakterlerinin rengini kontrol eder.
Renklendirme işlemi bitince, ekran hafızası (VideoRAM) 0-255 arası karakter kodları ile doldurulmakta. Böylece COMMODORE 64'ün tüm karakter seti gözlerinizin önüne serilecek. Dikkat ederseniz bir noktaya kadar normal olan karakterler, o noktadan sonra negatifleşmekte. İşte bizim saldıracağımız nokta burası olacak.
Ekranda cursor olarak gördüğümüz şey, aslında o an cursor'un üstünde bulunduğu karakterin normal ve negatif biçimlerinin arka arkaya gösterilmesinden başka bir şey değil. Bu durumda, eğer negatif karakterleri değiştirir ve sadece en alt kısımlarında düz bir çizgi kalacak şekilde yeniden oluşturursak, bilgisayar o karakterin negatifini gösterdiğini sandığı zaman, aslında altı çizili halini gösteriyor olacak. Şimdi bu değişiklikleri nasıl yaptığımızı bakalım...
Önce bazı değişkenleri ayarladıktan sonra, VIC'in 24 numaralı yazmacı ile oynayarak (bkz. Sayı 10 ve 12, COMMODORE 64 İLE GRAFİK) karakter setinin ve videoram'ın başlangıç adreslerini değiştiriyoruz. Karakter seti 53248'de, videoram'da 52224'de aktif hale gelmiştir artık. Ancak bu işin tam olması için CIA 2'nin (56576) içeriği ile de oynamak gerekiyor. Bu yöntemle BANK 4'ü seçerek her şeyi yerli yerine oturtuyoruz. Bir de 648'de ekran editörüne ekranın yeni yerini bildirince, her şey tamam oluyor.
Artık ekranın ve yeni karakter setinin kopyalarını bu bölgelere çıkarmak lazım. Bu yüzden önce 56333 ve 1 numaralı adreslerin içeriklerini değiştirerek, bilgisayarımızın kesintiye uğramasını önleyip karakter ROM'unu okumayı olanaklı kılıyoruz.
Ve 2 numaralı satırda ekranın içeriğinin taşınması ile işimize başlıyoruz. Ancak bu satırda ekranda sadece saçmalık göreceksiniz, çünkü karakter setini daha tanımlamadık. Programın geri kalan kısmında da, 3. satırın sonuna kadar eski karakter setinin bir kopyasını yeni yerine, üzerinde gerekli değişiklikleri yaparak çıkarıyoruz. İşte bu işlemin seyrine doyum olmuyor, çünkü tüm karakterlerin değişimini ekranda izleyebiliyorsunuz.
Artık işimiz bitmiştir. 4. satırda 1 ve 56333'deki değerleri eski haline döndürüp bilgisayarı normale döndürebiliriz. Cursor'umuzu da uygun bir yere yerleştirince, profesyonel cursor'umuz emrimize hazırdır...
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 24
BASIC programlarınızın dökümlerini renklendirmek ister misiniz?
BASIC'in en kötü yanlarından biri, PASCAL gibi modüler programlamaya kolaylık sağlamamasıdır. Siz gene de altprogramları kullanma yoluyla bayağı modüler bir program yazabilirsiniz. Ama sağolsun BASIC'in LIST komutu, hiçbir modülü görüntü olarak belli edemeyecektir. Görüntüyü de modüler yapabilmek için, REM'lerle, boşluklarla dolu bir program yaratmanız gerekecektir. Boşuna hafıza kaybı...
Peki, programınızın her modülü LIST sırasında farklı renklerde görünse nasıl olur?
Yapacağınız şey, her modülünüzün (altprogramınızın) başına bir REM satırı koymak ve REM komutunun arkasına en az bir karakterden oluşan bir yazı yazmak. BASIC programınızı böylece hazırladıktan sonra SAVE edin.
Sonra da, RENKLİ LIST programını yazıp çalıştırın. Şimdi de, demin hazırlıklarını yaptığınız modüler programınızı LOAD edin ve LIST komutunu verin. Her REM komutundan sonra gelen kısmın farklı bir renk ile LIST edildiğini göreceksiniz.
İşte bu rengi, REM komutundan sonra gelen ilk karakter belirleyecektir. Eğer arka arkaya gelen iki modülün aynı renge sahip olmasını istiyorsanız, REM'den sonra aynı harfi koyun. Eğer ayrı harfler koyarsanız, renkler de farklı olacaktır. Hoşunuza giden renkleri deneme yanılma metodu ile bulabilirsiniz. Örneğin A harfi beyaz, B harfi kırmızı döküm yaratacaktır.
Şimdi işin biraz teknik ayrıntısına girelim. Eğer bir REM komutunun o ana kadar geçerli olan rengi değiştirmesini istiyorsanız, REM ile yazacağınız harf arasında boşluk OLMAMALIDIR. Dolayısıyla, o ana kadar kullanılan rengin herhangi bir REM satırından sonra da korunmasını istiyorsanız, REM ile arkasından gelen yazı arasına en az bir boşluk koymalısınız. Bu arada dikkat edin, bir satırda sadece REM varsa, dökümün geri kalan kısmı siyah olacaktır.
Eğer RUN/STOP/RESTORE yaparsanız, renkli döküm işlemi bitecektir. Tekrar başlatmak için POKE 774,0: POKE 775,192 vermeniz gerekiyor.
Peki bu renkli döküm işi nasıl oluyor? Gördüğünüz gibi, programımız kısa bir makine dili rutinini 49152 ($C000) adresinden sonraya yerleştiriyor. Bir sonraki POKE komutları ile de, normalde sistemdeki BASIC komutlarını ekranda yazıya çeviren rutinin adresini saklayan 774/775 adreslerine, 49152'de başlayan yeni rutinin adresi yerleştiriliyor. Bir anlamda, LIST komutu önce bizim yazdığımız minik rutini işletecek, sonra kendi işini görecek hale getiriliyor. Bu makine dili rutinini bir parça inceleyelim:
Önce akümülatördeki değer yığın içine (stack) atılıyor. Sonra da, o sırada ekrana LIST edilen komutun REM olup olmadığı kontrol ediliyor. REM'in kodu $8F'dir. Eğer öyle değilse, $C010'a atlanıp akümülatörün değeri yenileniyor ve gerçek LIST rutinine atlanıyor.
Ancak REM'e rastlanmışsa, hemen arkasından gelen karakter okunup, eğer boşluk değilse, $0286 (646) numaralı adrese yazılıyor. Bu adres, ekrandaki yazının rengini kontrol eder. Eğer karakter boşlukla veya renk kodu 646'a yerleştirilmişse, Y indeksi başlangıç durumuna getirilip akümülatör yeniden orijinal değeri ile yüklenliyor ve sistemdeki gerçek LIST rutinine atlanıyor. Bu atlama sırasında, gerek Y yazmacı gerekse akümülatör başlangıçtaki değerlerine sahip oldukları için, esas LIST rutininin bu olaylardan haberi olmuyor.
İşte bu kadar. İşinize yaramasını dileriz...