C64 için Püf Noktaları
Karakter Seti Tanımlaması
C64'ün enteresan özelliklerinden birisi karakter setinin RAM'e alınmasına izin vermesidir. Bu özellik sayesinde istediğiniz karakterleri tanımlayabilirsiniz. Bilgisayar ekranında gördüğümüz her karakter 8*8'lik bir alana tanımlanmıştır. Bu alanda 64 tane nokta bulunuyor. Ekranda görünen noktalara açık, görünmeyenlere kapalı diyeceğiz. Ekranda bir karakterin görünmesini sağlayan açık noktalar oluyor. Her nokta bir bit olduğundan sekiz nokta bir byte tarafından temsil ediliyor. Bir karakterin tanımlanmasında 64 tane nokta (bit) kullanıldığından her karakter bilgisayarımızın hafızasında 8 byte'lık yer tutuyor. Program Döküm Eki'ndeki PROGRAM1A istediğiniz karakterdeki nokta durumunu gösteriyor. Bunu yaparken de istediğiniz karakter ekran büyütülmüş olarak geliyor. Ancak bu programı çalıştırmadan evvel saklayın ve PROGRAM1B'yi yazın. 1B'yi çalıştırdıktan sonra programımızı yükleyip çalıştırabilirsiniz. Program sizden görmek istediğiniz karakteri klavyeden girmenizi ister. Girdiğiniz karakterin ASCII kodu 120. satırdaki B değişkenine yüklenir. 140. satır büyük/küçük veya büyük/grafik karakter setini kontrol eder. Eğer incelenen karakterde nokta açıksa bir asterisk, kapalıysa bir nokta ekrana yazılır. İstediğimiz karakterlerin yapısını gördüğünüze göre artık kendi karakter setimizi oluşturabiliriz. Bunun için ilk olarak karakter setini ROM'dan RAM'e taşımalıyız. Daha sonra sıra işletim sistemine yeni karakter setinin nerede olduğunu söylemeye geliyor. Tabii bu sırada ekran hafızasını da kaydıracağız. Aşağıdaki ufak programı çalıştırmadan evvel 1B'yi yükleyip çalıştırın.
100 FOR 1— 13*4096 TO 14*4096-1
110 POKE |
120 POKE 53272,24:POKE 56576,148:POKE648,196
Program Döküm Eki'ndeki PROGRAM5 yeni karakter setini tanımlamanızı sağlayacak. Program sizden yeniden tanımlanmasını istediğiniz karakteri girmenizi isteyecek. İstediğiniz karakteri seçtikten sonra onu tanımlamaya başlayabilirsiniz. Açık olmasını istediğiniz noktalar için asterisk (*), kapalı olmasını istediğiniz noktalar için de nokta (.) kullanın. Bütün karakterlerin tanımlanması bittiğinde istenilen karakter yerine SON yazın. Kolay Veri Girişi. Kolay veri girmek için kursoru ekranın istediğiniz yerine götürmek çok faydalı olur. Bir satırda kursoru istediğiniz yere getirmek için TAB komutunu kullanabilirsiniz. Ama kursoru ekranın belirli bir yerine götürecek bir komuta sahip değiliz. Hafızanın sıfırıncı sayfasında iki adres kursorun bulunduğu satırı ve kolonu saklar. Bu hafıza adreslerini PEEK komutu ile okuyarak kursorun ekranın neresinde olduğunu öğrenebiliriz:
10 PRİNT “KURSORUN YERİ SATIR”
Kursoru istediğimiz yere yerleştirebilmek için bu iki adrese gerekli değerleri POKE etmek yeterli olmaz. Aşağıdaki ufak program, kursoru istediğiniz yere getirecek:
10 INPUT “SATIR”;
20 INPUT “KOLON"';K
30 POKE 214,8
40 POKE 211,K
50 SYS 58640
60 PRİNT “DENEME”;
SYS58640 komutu 214 ve 211 adreslerindeki değerlere göre kursoru ekrana yerleştiriyor. Bu iki adres ve SYS58640 komutu ile programlarımızı güzelleştirebiliriz. Mesela ekranın üst veya alt bölümünü mesaj satırı olarak ayırabilir, buradan gerektikçe kullanıcıya mesaj verip tekrar kursoru eski yerine döndürebilirsiniz. Bu tür uygulamaya bir örnek görelim:
10 R- PEEK(214)
20 C-
30 POKE 214,0
40 POKE 211,10
50 SYS 58640
60 PRİNT “LUTFEN DİSKETİ TAKIN”
70 POKE 214,R
80 POKE 211,C
90 SYS 58640
En üstteki satırın numarası 0, en alttaki satırın numarası 24'tür. En soldaki kolon 0, en sağdaki kolon 39'dur.
Yanıp Sönen Kursor
GET komutunu kullandığınızda kursorun ortadan kaybolduğunu görürsünüz. Buna karşın INPUT komutu kullanıldığında kursor yanıp sönmeye devam eder. GET komutu kullanıldığında da kursorun yanıp sönmesi bazı hallerde iyi olur. 204 numaralı adres kursorun durumunu belirler. Eğer bu adresin değeri sıfırdan farklıysa kursoru göremezsiniz. Adresin değeri sıfırsa kursor yanıp söner. GET komutu ile 204 numaralı adresin kullanımını birleştirerek kursoru görünür yapalım:
10 POKE 204,0
20 GET THEN 20
30 POKE 204,1
40 PRİNT AS
Bazen kursor açıldıktan hemen sonra kapatılabilir. Bu durumda ekranda beyaz bir kare görürsünüz. Bunu engellemek için programımıza bir satır daha ekleyelim:
25 IF PEEK (207) THEN 25: MID$() MID$ fonksiyonunu kullanarak belirli bir karakter grubunu istediğiniz yerinden ayırabilirsiniz. Mesela,
10 AS-“DENEMEYAZI”
20
30 PRİNT B$
Bunun sonucunda ekrana MEY yazacak. MID$ kullanarak bir karakter grubunun belirli bir yerinde değişiklik yapmak mümkün değil. Mesela,
10 “DENEMEYAZI”
20
30 PRİNT A$
Bu program çalıştığında 20 numaralı satırda SYNTAX ERROR verir. Ancak bu tür kullanıma izin verecek bir programı Program Döküm Eki'nde bulabilirsiniz (PROGRAM6). İlk olarak Program6'yı yükleyip çalıştırdığınızda 20 numaralı satırın bilgisayar tarafından kabul edildiğini göreceksiniz. Sonuç:
DENE123AZI olur.
Program6'nın etkisini denemek için deneyebileceğiniz bir program şu şekilde olabilir.
10 DİM AS(10)
1-1 TO 10
60
70 NEXT
80 FOR TO 10
90 PRİNT
100 NEXT
Tabii bu programı çalıştırmadan evvel Program6'yı yükleyip çalıştırmayı unutmayın.
OYUNLAR İÇİN KOLAYLIKLAR
Star Quake: Oyunda başarılı olabilmek için teleport şifrelerini bilmeniz gerekir. Kullanacağınız şifreler: chasm, astra, sigma, hylis, cappa, semur, malis, meter, xenon, cosin, plasm, optic, polar ve z.a.p.
Rambo: Her iki porta da joystick takın. İleri iterken diğerini geri çekin. Böylece düşman savunmasından etkilenmeden ilerleyebilirsiniz.
Barbarian (AMIGA) Oyunu yükledikten sonra ana klavyedeki tuşları kullana-
Tak 04-08-59 yazın. Artık hiçbir yaratık size dokunamayacak,
Marble Madness Birinci düzeyde GOAL.'a gelmeden sol tarafa atlayın. Başarılı atlayışımızdan ötürü puan alacaksınız. Bulunduğunuz yerde gizli bekleme yerini bulursanız gizli düzeye aktarılırsınız.
Exelon F tuşuna basarak tuş tanımlamaya geçin, tuşların karşıtlıklarına sıra ile Z,O,R,B,A yazın. Şimdi sonsuz hakkınız var.
MAKİNE DİLİ
Biraz da makine dili uğraşalım. Amacımız “Garbage Collection” işlemini hızlandıracak bir program yapmak. Büyük bir program yazarken veya büyük karakter dizileri ile uğraşırken bilgisayarın ağırlaştığını fark etmişsinizdir. Hafızanın tamamı kullanıldığında, BASIC artık kullanılmayan karakter dizileri ile ilgilenmeye karar verir. Böylece kimi zaman oldukça vakit alan bir iş başlamış olur. Bu işleme daha evvel de söylediğimiz gibi “GARBAGE COLLECTION” (çöplük toplama) adı veriliyor. Garbage Collection işleminin hafıza bitmeden evvel başlamasını istersek FRE() fonksiyonunu kullanmamız yeterli olur. BASIC bu işlemi gerçekleştirebilmek için ilk önce yüksek hafıza bölgesinde aktif durumda karakter dizisi arar. Bulunan karakter dizisi mevcut olan en yüksek hafıza bölümüne kopya edilir. Eğer bu kısımda aktif olmayan karakter dizisi varsa aktif durumdaki karakter dizisi bunun üzerine yazılmış olur. Bu işlem bütün aktif karakter dizileri kopyalanana kadar devam eder. Karakter dizisi miktarının karesi kadar süre Garbage işlemi sırasında gidiyor. Ne kadar süre kaybedeceğiniz hakkında fikir sahibi olmak isterseniz aşağıdaki programı deneyin:
10D-500
20 DIM X$(D)
30 FOR J-0TO D
40
S0 NEXT J
60 PRİNT “ISLEM BASLIYOR...”
90 T- TI:3 - FRE(0)
80 PRİNT (TI-T)/60;“SANIYE”
10 numaralı satırda D değişkeninin değerini değiştirerek artan sayıdaki karakter dizilerinin zamanı nasıl etkilediğini görebilirsiniz. Garbage Collection sırasında zaman kaybını önlemek istiyorsanız Program Döküm Eki'ndeki PROGRAM2'yi deneyin. Programımız $CA20 ile $CBFF (51744-52223) arasında yer alıyor. Programı yazmayı bitirdikten sonra çalıştırmadan evvel muhakkak kasete veya diskete saklayın.
Programımızı disketten,
LOAD“program-ısmı",8,1
kasetten,
LOAD“program-ısmı”,1,1
şeklinde yükleyin. Program-ismi yerine programı hangi isim altında sakladıysanız o ismi yazın.
Programı aktif hale getirmek için,
SYS 51744
komutunu vermeniz yeterli olur. Programımız ilk olarak BASIC'i ROM'dan RAM'e geçiriyor ve BASIC üzerinde bazı değişiklikler yapıyor. Değişiklik yapıldığını READY! yazısının değişik yazılışından anlayabilirsiniz. RUN STOP/RESTORE tuşu programı etkisiz hale getirir. Tekrar çalışmasını sağlamak için SYS 51744 vermek yeterli olur.
BASIC PROGRAMLAR
Biraz da BASIC programlarıyla ilgilenelim. Konumuz verileri ekrana formatlı olarak çıkarmak veya sayıların noktadan sonra gelen kısımlarını iki rakama indirmek,
Eğer ufak bir muhasebe programı yazmak isterseniz başınız noktadan sonra gelen sayılarla derde girer. Noktadan sonra belirli miktarda sayı gelmesini istiyorsanız ne yapacaksınız?
Ne yazık ki, BASIC 2.0'da sayıları düzenleyerek yazmayı sağlayan bir komut yok. C128'de bu sorun PRINT USING komutu kullanılarak halledilmiş. C64'de böyle bir komut olmadığı için 4.231246 gibi sayıları okumak zorundasınız. Ancak PRINT USING komutunun görevini yerine getirecek bazı programlama yöntemleri sayesinde sayıları istediğimiz formata sokabiliriz. Standart yöntemlerden birisini görelim:
S-1NT(V*100-4 0.5)/100
V değişkeninde sayımız bulunuyor. Ancak, bu yöntemin zayıf noktası, eğer noktadan sonra sıfır varsa kayboluyor. Mesela 44.90001 sayısı 44.9'a dönüşüyor. Ama bizim istediğimiz değer 44.90'dı. Buna benzer sorunları çözmek için başka bir çözüm yolumuz var:
- (.001*SGN(5)))
S$ -
Bu yöntem hemen hemen her zaman çalışıyor ama 837.149 sayısında hata yapıyor. Bu sayıda sonuç olarak 837.15100 sonucunu alıyoruz. Program Döküm Eki'nde PROGRAM3 ve bahsettiğimiz yöntemlerin biraz daha gelişmişini kullanarak sayıları formatlıyor. PROGRAM3 -1000 ile 1000 arasında tesadüfi sayılar üretip bu sayıları formatlıyor. Bu programda kullanılan yöntem -9999999.99 ile 9999999.99 arasındaki sayıları formatlayabilir. 5000 ile 5090 satırları arasındaki kısmı kendi programlarınızda kullanarak sayıları istediğiniz şekilde formatlayabilirsiniz. Programlarınıza C1= .5:C2= 1:C3= 100 satırını da eklemeyi unutmayın. V değişkenine formatlanmasını istediğiniz sayıyı yerleştirin ve GOSUB 5000 komutu ile rutinimizi çalıştırın. Formatlanma işlemi sona erdiğinde sayınızı yeni şekli ile N$ değişkeninde bulabilirsiniz. PROGRAM 40 tane tesadüfi sayıyı ekrana veya yazıcıya basar. Sayılar 580 numaralı satır sayesinde sağa ayarlı olarak basılır.