C64 için Püf Noktaları

C-64'ümüzün normal tuşlarından başka dört tane de fonksiyon tuşu vardır. Bu tuşlardan BASIC programlarda nasıl yararlanabiliriz? Mesela programın çeşitli seçeneklerine fonksiyon tuşlarına basılarak geçilmesini sağlayabiliriz. Her fonksiyon tuşunun diğer tuşlarda olduğu gibi bir ASCII kodu vardır. Bu kodlar aşağıdaki gibidir:

F1: 133 F2: 137 F3: 134 F4: 138 F5: 135 F6: 139 F7: 136 F8: 140

Bu kodların yardımı ile fonksiyon tuşlarını kullanarak seçim yapabilecek ufak bir program yazalım:

100 GET R$: İF RS$— ” ” THEN 100
140
120 İF THEN 1100: REM
130 1F THEN 41200: REM F3
140 1F THEN 1300: REM
150 İF R—136 THEN 1400: REM F7
160 İF R—137 THEN 41500: REM F2
170 1F THEN 1600: REM F4
180 İF R— 139 THEN 1700: REM F6
190 1F THEN 1800: REM F8
200 GOTO 100

100 numaralı satır bir tuşa basılıp basılmadığını kontrol ediyor. 140 numaralı satırda basılan tuşun kodunu R değişkenine yüklüyoruz. 120-190 satırlar arasında F tuşlarına basılıp basılmadığı kontrol ediliyor. Eğer basılan tuş F tuşlarından birisi değilse 200 numaralı satırla kontrol 100 numaralı satıra aktarılıyor. | Bu programı ON ... GOTO komutuyla daha kısa olarak yazmak da mümkün:

400 GET R$: İF ” ” THEN 100
1410 (433 OR R) 140 THEN 4100
120 ON R-13260TO 1100, 1200, 1300, 1400, 1500,
1600, 1700, 1800

Fonksiyon tuşlarından BASIC programlarda nasıl yararlanabileceğimizi gördük. Program döküm ekindeki PROGRAM-1 fonksiyon tuşlarının programlanmasını sağlıyor. Bu programı kullanarak her fonksiyon tuşuna on karakterlik bir yazı yüklemek mümkün. Fonksiyon tuşuna her basıldığında ekrana o fonksiyon tuşuna yüklenmiş olan yazı gelecek. Mesela fonksiyon tuşlarına komutlarını yükleyebiliriz. Tanımladığınız maksimum on karakterlik komuta RETURN tuşunu da ekleyebilirsiniz. Böylece tuşa basılır basılmaz komut çalışır. Mesela F4 tuşuna LIST komutunu RETURN tuşu ile birlikte yüklersek, her F4 tuşuna basıldığında program listesini alırız. Normal olarak SHIFT tuşları ile birlikte kullanıldığında sekiz tane fonksiyon tuşu vardır. Programımız fonksiyon tuşlarının sayısını on altıya çıkarıyor. On altı fonksiyon tuşunu elde etmek için basılması gereken tuş kombinasyonları:

FA -> FHA F2 —> SHFT FA F3 ->RB FA —> SHFTF3 F5 -> F5 F6 —> SHFTF5 FZ —>F7 F8 —>

F1 -> COMMODORE F1 F2 -> COMMODORE F3 F3 -> COMMODORE F5 F4 -> COMMODORE F7 F5 -> CTRL F1 F6 -> CTRL F3 F7 -> CTRL F5 F8 -> CTRL F7

Program ilk olarak gerekli makine dilindeki programı hafızaya yerleştiriyor. Daha sonra 16 fonksiyon tuşu için gerekli tanımlamaları hafızaya yerleştiriyor. Hafızaya yerleştirilen tanımlamalar 300 numaralı satırdaki DATA'larda saklanıyor. İsteğinize göre bu tanımlamaları değiştirebilirsiniz. Ancak tanımlamanın en fazla on karakter olabileceğini unutmamak gerekiyor. Tuşa basılır basılmaz istenilen komutun uygulanmasını istersek RETURN tuşunu da tanımlamaya eklemek gerekir. Sola bakan ok tuşu RETURN tuşunu temsil ediyor. 250 numaralı satırda sola bakan ok tuşu RETURN'e çevriliyor. Eğer tanımlamanın içinde çift tırnak işareti kullanmak isterseniz bunun yerine tek tırnak işaretini kullanın. Tanımlamanın içinde virgül kullanmanız gerekiyorsa tanımlamayı tırnak içine alın. Tanımlamalar $CF00 adresinden başlayarak hafızaya yerleştiriliyor. Eğer hafızanın bu bölgesini başka bir iş için kullanmak istiyorsanız veya tanımlamaların başka bir yere yerleştirilmesini istiyorsanız 230 numaralı satırdaki adresi değiştirmek gerekir. Bundan başka 170 numaralı satırdaki DATA komutunda yer alan 0 ve 207 numaralı sayıları yeni adrese göre LOW, HIGH byte düzeninde yerleştirin. Yeni kullanılan adres bölgesinde en az 160 byte (16 tuş * 10 karakter) olmalı. RUN/STOP-RESTORE tuşlarına basarak fonksiyon tuşlarındaki tanımlamaları etkisiz hale getirebilirsiniz. Tekrar aktif hale getirmek için SYS 828 komutunu kullanmak gerekir.

OYUNLAR İÇİN KOLAYLIKLAR

Defender of the Crown (AMIGA)

Gezici orduya asker naklederken 'K' tuşunu basılı tutarak mouse ile şövalye almaya çalışırsanız HOME CASTLE'ınızda 1024 şövalyeye sahip olursunuz. Bundan başka 1024 şövalye de gezici ordunuza geçer. Bu yöntem hiç paranız olmasa bile çalışıyor. Toplam olarak 2048 şövalyeniz olduğundan bir kaleye baskın düzenlediğinizde birkaç kılıç darbesi baskını başarıya ulaştırmaya yetiyor. Bu ipucunu gönderen, İstanbul'dan Sinan Erel'e teşekkür ediyoruz.

BUGGY BOY Her yarış pistinde sınırsız zaman elde edebilmek için aşağıdaki POKE komutlarını kullanın. İlk olarak oyunu yükleyin ve C64'ü RESET edin. Ve sıra ile POKE komutlarını girin:

POKE 4768,133
POKE 4769,20
POKE 39927,96
POKE 2048,32
POKE 2049,104
POKE 2050,13
SYS 2560

GHOSTBUSTERS

İsim verdikten sonra banka hesabı sorusuna Y ile evet cevabı verin. Sorulan numaraya 125 yazdığınızda oyuna 540000$ ile başlayabilirsiniz. İstanbul'dan Hasan Şapoğlu'na teşekkür ediyoruz.

MAKİNE DİLİ

Bazı ilginç adreslerin içeriği ve işlevlerini görelim: $00A0: Bu adres ve $00A1 ile $00A2 C64'ün saatini düzenli olarak tutarlar. $00A2'nin içeriği saniyenin atmışta birinde bir artar. Bu adresin değeri $FF olduğunda $00A1 adresinin değeri bir artar, $00A2'nin içeriği $00 olur. $00A1 adresinin değeri $FF'e ulaştığında, $00A0'ın değeri bir artar. Bu adreslerin değerini BASIC'ten TI veya TI$ değişkenlerini kullanarak değiştirebilirsiniz. TI$ değişkeninin değeri “SSDDSS” şeklindedir. En soldaki iki karakter saati, ortadaki iki karakter dakikayı ve en sağdaki iki karakter de saniyeyi temsil eder. Bu değişkenin değerine bir örnek verelim: TI$ = “23:30:59” $00B7: Bu adreste o anki dosya ismindeki karakter sayısı saklanır. Bu sayı TEYP için kullanılan dosya isimlerinde maksimum 187, disket dosyalarında en fazla 16 karakter olabilir.

Disket dosyaları her zaman bir dosya ismi isterler. Teyp dosyaları için dosya ismi verilmesi gerekli değildir. Bu yüzden adresin içeriği bazen $00 olabilir. SEARCHING FOR, SAVING ve FOUND mesajlarında teyp dosya ismi 16 karakterden daha uzun olsa bile sadece ilk 16 karakter ekranda gösterilir. Teyp dosya isimlerinin 187 karaktere kadar kullanılabilmesi, makine dilinde yazılmış ufak programların dosya adıymış gibi teyp HEADER'ına yazılma imkanı verir. $00C5: Bu adreste bir kod saklanır. Saklanan kod basılan tuşun kodudur. Ancak bu kod ASCII kod değildir. Mesela O tuşuna basarsanız bu adresin içeriği $23 olur. Adresin içeriği $40'sa hiçbir tuşa basılmamış demektir.

$00C6: Bu adresin içeriği klavye tamponunda (buffer) kaç karakter olduğunu gösterir. Olabilecek en yüksek değer $0A'dır, yani 10 tanedir. $028D: Eğer SHIFT tuşuna basılmışsa adresin değeri $01'dir. COMMODORE tuşuna basıldığında adresin değeri $02, CTRL tuşuna basıldığında $04 olur. $0400: $0400-$07E7 arasında ekran hafızası yer alır. Bu adresler arasında ekranda görülen karakterlerin kodları saklanır. İstediğiniz bir karakterin kodunu bu adresler arasında bir yere POKE ederek o karakterin ekrana çıkmasını sağlayabilirsiniz. Ekran hafızasını, 2Kb'lık bir dilim halinde belleğin istediğiniz bir yerine kaydırabilirsiniz. Bunun için $D018 ve $DD00 adreslerinin içeriklerinde değişiklikler yapmanız gerekir. $07E8: $07E8-$07FF arasındaki adreslerde SPRITE'lar için saklanan bilgilerin başlangıç adresleri bulunur. $0801: $0801-$9FFF arasındaki adreslerde BASIC program yer alır. Eğer bir monitor (Makine dilinde yazılmış programları incelemek veya makine dilinde çalışmak için kullanılan bir program) vasıtası ile bu adreslere bakarsanız BASIC programınızı göremezsiniz. Bu sizi şaşırtmasın, hafızadan en iyi şekilde yararlanmak için BASIC programlar yazıldıkları gibi saklanmazlar. Her BASIC komutunu temsil eden bir kod vardır. Komutlar yerine bu kodlar saklanır. BASIC bir program satırını şu şekilde saklar: 1) İki byte (LO/HI) link adresi. Bu adres bir sonraki BASIC satırının başlangıcıdır. Programın en son satırında link adresi olarak $0000 kullanılır.

2) İki byte (LO/HI) program satır numarası. Satır numarası kullanıcı tarafından verilir. Bu sayı 0 ile 63999 arasında olmalıdır. 3) BASIC komut kodları ve veriler. Bu bölüm en fazla 250 byte uzunluğunda olabilir ancak bunun sadece 80 byte'ı klavyeden girilebilir. 4) Satır sonunu belirleyen karakter: $00. Bu sayı BASIC'e satırın sonuna gelindiğini söyler. $A004-$A00C arasındaki adresler BASIC ROM'una aittir. Bu adreslere bakarsanız CMBBASIC yazısının ASCII kodlarını görürsünüz. $D800: $D800-$D80C arasındaki adresler Renk RAM'inin bir bölümüdürler. Bu adreslerde yer alan değerlerin LOW dört biti önemlidir. Çünkü renk hafızası için sadece dört bit kullanılmaktadır. Dört bit kullanarak toplam 16 ayrı renk elde etmek mümkün. Bu sayıda C64'ün bize verdiği renk sayısıdır. Bu adreslerdeki değerlerin dört biti normal olarak $0'dır. Bu değerler siyah rengin kodu olan sıfırdır.

BASIC PROGRAMLAR

BASIC dilinin en şikayet edilen özelliklerinden birisi de çok yavaş olmasıdır. Ancak iyi bir programlama tekniği kullanarak yazdığımız programların normale göre çok daha hızlı çalışmasını sağlayabiliriz. Programların daha hızlı çalışmasını değişkenler üzerinde yapacağımız uygulamalarla sağlayacağız. Ancak ilk olarak BASIC'in değişkenleri nasıl sakladığını görelim: Sayısal değişkenler programda tanımlandıkça isimleri ve değerleri BASIC programın arkasından itibaren saklanır. BASIC o ana kadar tanımlanmış değişkenlerin ismini bir tabloda tutar. Yeni bir değişken tanımlandığında değişkenin değeri ve ismi tablonun en sonuna eklenir. Programın çalışması sırasında ne zaman bir değişken kullanılsa bu tablodan değişkenin bulunması gerekir. İstenilen değişken için gerekli olan bilgi tablonun başından başlanarak sonuna doğru değişken bulunana kadar aranır. Değişkenler için tutulan bu tablo programın çalışması sırasında oluşturulduğundan ilk tanımlanan değişken tablonun en başında yer alır. Bu yüzden tablonun en başında yer alan değişkenler programın içinde en hızlı işlem gören değişkenlerdir. Eğer bir değişkeni programın başında tanımlarsanız tablonun başlarında yer alacağından BASIC tarafından kolay bulunur. Anlattıklarımızın uygulamasını görmek için iki programı yazıp çalıştırın: 10 20 30 40 50 TI$ = “000000” 60 FOR X = 1 TO 1000 80 NEXT X 90 A1 = TI: PRINT A1; “VURUŞ”, A1/60; “SANİYE”

50 numaralı satırda TI$ değişkeni ile geçen süreyi sıfırlıyoruz. 90 numaralı satırda istenilen döngünün yapılması için geçen süre veriliyor. İki sayının toplanması için geçecek zaman çok az olacağından bu işlemi 1000 kere yaptırdık. Bu programın çalışma süresi yaklaşık olarak yedi saniye alıyor. Şimdi 60-80 arasındaki satırları şu şekilde değiştirelim:

60 FOR 1 TO 1000
70B->B4C
80 NEXT A

Program bu hali ile çalışmasını yaklaşık olarak dört saniyede tamamlar. İki program hemen hemen aynı olmasına rağmen niçin ikincisi daha hızlı çalışıyor? İkinci programda tanımlanmış olan üç değişken tabloda ilk üç sırada yer alıyorlar. Buna karşın ilk programda tanımlanmış olanlar ise değişken tablosunda 24 ile 26'ncı sıralar arasındaydılar. Bu farklılık elbette alfabetik sıralamadan değil değişkenleri tanımlama sıralamasından kaynaklanıyor. BASIC'in değişkenleri ne şekilde kullandığını gördük. Programlarımızın hızlı çalışmasını sağlamak için sık sık kullanılan değişkenleri ilk önce tanımlamak programın hızlı çalışması açısından önemlidir. Örnekte programları biraz daha hızlandırmak için NEXT komutundan sonra gelen değişkeni kaldırın yani 80 numaralı satır.

80 NEXT

olsun. Bu uygulama sayesinde programın çalışma süresi biraz daha kısalır. Matematik işlemler yapan programlarda da zaman kazanmamızı sağlayacak yollar var. Mesela 53 sayısının karesini alacak bir program yazalım:

10 TI$ — “000000*
20 FOR J- 1 TO 1000
30
40 NEXT
50 AL-TI.FRİNT A1; 1/60; “SANİYE”

Programımız 1000 kere 53 sayısının karesini alacak, programın bu işlemi yapması yaklaşık olarak yedi ile sekiz saniye sürer. Şimdi 30 numaralı satırı değiştirerek programı yeniden yazalım:

10 TI$ - “000000”
20 FOR J— 1 TO 1000
30 A—b32
40 NEXT

Bu programda 53 sayısının karesini 1000 kere hesaplıyor ama bu sefer programın çalışma süresi yaklaşık olarak 55 saniyeye çıkıyor. Kare işleminde çarpma işlemini kullanarak hesaplama süresini kısaltabilirsiniz. ^ işlemini sayının karesini almanın dışında yapılacak üs işlemlerinde kullanmak daha iyidir. Örnek programı daha da hızlandırmak için 5 numaralı satıra B=0 ekleyin ve 30 numaralı satırı 30 A=B*B şeklinde değiştirin. Gerekli değişkenler tanımlanmış olduğundan program daha hızlı çalışacaktır. Şimdilik hoşça kalın...