C64 İÇİN PÜF NOKTALARI (1)

BURAK KİPER TEKRAR EDEN TUŞLAR

C64 ile çalışırken fark etmişsinizdir, kursor tuşları ve boşluk tuşu basılı tutulduklarında tekrar ederler. Buna karşın diğer tuşları basılı tutsanız da sadece bir kere çalışırlar. Bütün tuşların basıldıklarında tekrar etmeleri özellikle bir program yazıyorsanız veya kelime işlem türünde bir çalışma yapıyorsanız çok yararlı olur. Tuşların tamamının basıldıklarında tekrar etmelerini sağlamak için bir tek POKE komutu yeterli oluyor. Değişikliği istersek bir program içinde, istersek direkt modda yapabiliriz. Kullanacağımız adres 650. Bu adrese 0 değerini verirsek sadece kursor tuşları tekrar eder. 128 verirsek bütün tuşlar tekrar eder. 64 değerini vererek tüm tuşların tekrar etme özelliğini kapayabiliriz, ama bu durumda boşluk tuşu ve kursor tuşları da tekrar etme özelliğini kaybederler.

10 POKE 650,128:REM tüm tuşlar tekrar eder.
20 POKE 650,0 :REM sadece cursor tuşu tekrar eder.
30 POKE 650, 64:REM tekrar etme kapanır.
Tuşların tekrar hızlarını ve tekrar etme için gecikmeleri-
ni ayarlayan değerleri 651 ve 652 adreslerinde bulabiliriz.

WAIT KOMUTU

WAIT komutu ne işe yarar? Birçok farklı BASIC dilinde bilgisayarın belirli bir süre işini bırakıp beklemesini sağlayan komutlar vardır. WAIT komutu ilk bakışta bu işi üstlenmiş görünüyor, ancak kullanımı oldukça farklı. Amacımız WAIT komutunun ne yaptığını ve ne için kullanılabileceğini açıklamak. İlk önce komutun yapısına bakalım:

WAIT A,B

A değişkeninde bir hafıza adresi olsun. WAIT komutu A değişkeninde bulunan adresin içeriğini alıp B değişkenindeki değeri ile AND işlemini gerçekleştirir. Bu işlemin sonucu sıfır değilse program akışı devam eder. A değişkeninde yer alan hafıza adresi bir giriş çıkış veya başka bir aleti ilgilendiren adres değilse veya bu adresin içeriği interrupt yolu ile değiştirilmiyorsa programınız bu noktada sonsuza kadar bekleyecek demektir. Bu yüzden programımızda WAIT komutunu kullanırken çok dikkatli olmamız gerekir. WAIT komutundan nasıl yararlanabiliriz? Mesela bazı özel tuşlar basılana kadar program akışını durdurmak istersek WAIT komutu çok işimize yarar. 653 numaralı hafıza adresinde SHIFT, COMMODORE veya CTRL tuşlarının basılıp basılmadığına dair bilgi saklanır. CTRL tuşu basılana kadar bekleyecek bir program yazalım. 10 “CTRL TUŞUNA BASIN.”

20 WAIT 653,4:REM CTRL TUSU BASILANA
KADAR BEKLE.

20 numaralı satırda bilgisayar CTRL tuşuna basılana kadar bekleyecektir. Aynı beklemeyi SHIFT ve COMMODORE tuşları için sağlamak istersek yapmamız gereken;

WAIT 653,1:REM SHIFT TUSU ICIN BEKLE
WATT 653,1:REM COMMODORE TUSU ICIN BEKLE

Herhangi bir tuşu kontrol edebilmek için 203 numaralı adresi WAIT komutu ile kullanmamız gerekir. Klavyede hiçbir tuşa basılmamışsa 203 numaralı adresin içeriği 64 olur.

Bilgisayarın bir tuşa basılana kadar beklemesini sağlayan bir program yapalım.

10 203,63
20 GET A$;

FRE FONKSİYONU

Bilgisayarı ilk açtığınızda “38911 bytes free” yani yaklaşık olarak 39Kbyte boş yerimiz olduğunu görürüz. Ama

PRINT FRE (0)

PRINT FRE(0) komutunu verdiğimizde cevap olarak -26627 değerini alırız. Bu değere göre bilgisayarın boş hafızası olmadığı gibi, 26627 byte kaybetmiş görünüyor. FRE fonksiyonunun verdiği cevabı düzeltebilmek için 2'nin 16'ıncı kuvvetine, yani 65536 sayısına FRE fonksiyonundan aldığımız cevabı eklemek gerekir. FRE fonksiyonunun niçin böyle bir hata yaptığını anlamak için nasıl çalıştığını bilmemiz gerekiyor. Artık kullanılmayan karakter dizileri çıkarılıp hafızada boş yer açılır. Bu işleme “GARBAGE COLLECTION” adı veriliyor. Bu işlemden sonra boş hafıza alanı hesaplanıyor. Bunun için $33/$34 adreslerinde tutulan dizilerin başlangıç adresinden $31/$32 adreslerinde tutulan dizilerin bitim adresi çıkarılıyor. 16-bit şeklinde elde edilen netice “floating point” şekline çevriliyor. Çeviri yapıldığı anda elde edilen netice hatalı hale geliyor. Çünkü integer halindeki sonucumuz floating point çevrimi sırasında işaretli (+ veya -) olarak ele alındığından -32768 ile 32767 arası bir sayı haline geliyor. Eğer sayımız bu işleme tabi tutulmasaydı, 0 ile 65536 arasında bir değer taşıyacaktı. FRE fonksiyonunun nasıl çalıştığını ve neyin hataya sebep olduğunu gördük. Program Eki'ndeki PROGRAMI çalıştığında FRE fonksiyonu doğru çalışır hale gelecek.

OYUNLAR İÇİN KOLAYLIKLAR

Bazı PEEK ve POKE komutları sayesinde oyunları kısa yoldan bitirmek isterseniz oyun programını yükledikten sonra söylediklerimizi uygulayın.

KRAKOUT Puan tablosuna adınızı yazmak yerine (C) yazarsanız ilk 25 düzey için sonsuz hak elde edersiniz. TRAILBLAZER

SYS64738
Sonsuz zaman için
POKE 29738,234
POKE 29739,234
Sonsuz atlama hakkı
POKE 30889,234
POKE 30890,234
POKE 30891,234
SYS 25729 oyunu başlatır.

JACK THE NIPPER

Açılış ekranında iken ZAPIT yazarsanız ekranın kenarları beyazlaşır ve oyun süresince hiç ölmezsiniz. PANTHER

SYS64738
POKE 15324,234
SYS 4096

İlk üç düzeyde hiç saldırıya uğramayacaksınız. NEMESİS Oyunu yükleyin. Ateş tuşuna basmadan evvel SHIFT tuşuna basıp dört defa boşluk tuşuna basın. Sol üst köşede bir şeyler gözükecek. Kaç oyuncu istediğinizi seçin. Oyunculardan birinin gemisi görünmez olacak. MISSION CTRL, Commodore tuşu, 2, O, R, L, 1, K tuşlarına aynı anda basın. MUTANIS Oyunu yükleyin ve bilgisayarı RESET'leyin. POKE 9273,234 POKE 9274,234 SYS 4096 Artık sonsuz hakkınız var. THE EQUALISER Oyun başladıktan sonra C tuşuna basarken RESTORE tuşuna her basışınızda bir sonraki düzeye geçersiniz. Böylece oyuna istediğiniz düzeyden devam edebilirsiniz.

AMICA

SEYFETTİN ÇANKAYA

INPUT VE OUTPUT

Bilgisayarlarda gerekli bilginin girişi ve işlenmiş bilginin çıkışı için kullanılan keyboard ve ekran gibi donanımların işlevlerini yerine getirmekte kullandıkları getchar( ) ve putchar( ) fonksiyonlarını tanıyalım. Getchar( ) ve putchar( ) tek bir karakter uzunluğundaki bilginin giriş ve çıkış işlevini yerine getirir. Getchar( ) fonksiyonu her çağrılışta bir karakter uzunluğundaki bilgiyi keyboard'dan alır, benzer şekilde putchar( ) bir karakterlik bilgiyi ekrana gönderir.

Getchar( ) Kullanımı:

c = getchar( ) şeklindedir. Böylece getchar( ) ile klavyeden okunan ASCII kodları c değişkeninde saklanır. Bu

ve C (3)

bilgiyi ekrana aktarmak istersek, putchar(c)

fonksiyonunu kullanmamız gerekir.

Putchar( ) içinde yer alan c değeri getchar( ) ile elde edilen değeri içeren değişkendir. Kısa bir programla anlatılanları özetleyelim:

main ( ) / * keyboard okunan
bilginin ekrana aktarılması*/
int c;
c — getchar ( ) ;
while (c ! - EOF) |
putchar (©);
c — getchar ( )
|
|

Program getchar( ) ile okunan karakterin putchar(c) ile ekrana çıkışını sağlamaktadır. (!=) ifadesi (eşit değil) mantıksal durumuna karşılık gelmektedir. Önceden anlatılan while işlemi (c != EOF) şartı ile ortadan kalkana kadar devam etmektedir. EOF (end of file) gösterimi karakter girişinin sona erdiğini ifade eder. EOF değeri -1 veya 0'dır ve sembolik bir sabittir. Büyük harfle yazılmış olması da bunu göstermektedir. Programda önemli bir nokta c değerinin karakter değil de tamsayı (integer) olarak tanımlanmış olmasıdır. Bunun nedeni getchar ile elde edilen değerin ASCII kodu olmasıdır. Benzer şeyler putchar(c) için de söylenebilir. Şimdi yazdığımız programı daha kısa olarak tekrar yazalım:

main
inte;
while ((c — getchar ( )) ! EOF)
putchar(c) ;
|

Bu örnekte while çevrimi içinde hem karakter okunmakta, hem de karşılaştırma işlemi yerine getirilmektedir. (c = getchar( )) ifadesi parantez içindedir. Bunun nedeni işlem sırasının karışmaması içindir, çünkü

(c — getchar ( )! EOF)

ifadesinde getchar( ) != EOF mantıksal bir işlemdir ve ya 1 ya da 0 olması gerekir ve c de bu değeri alır.

KARAKTER SAYMA

Şimdi kaynak kitabımızın 16. sayfasında yer alan keyboard'dan okunan karakteri sayan programı inceleyelim:

main ( ) /* arakter sayan program */
| int nc ;
ne— Ö;
while (getchar ( ) ! —- EOF)
4 4 NC;
printf nc);

Programda yer alan ++nc işlemi bir arttırma anlamındadır ve matematiksel gösterimi nc = nc + 1'dir. Benzer olarak --nc de bir çıkartma işlemidir. Bu da nc = nc - 1 şeklinde ifade edilir.

Önceden görmüş olduğunuz for işlemi ile program daha kısa olarak yazılabilir.

main ( )
int nc; |
for (nc—0 ; getchar ( ) !— EOF; 4 4 nc)
printf Vn”, nc) ;
|
|

Bu örnekte for çevrimi getchar( ) != EOF olduğu sürece devam etmekte ve sayma işlemi ++nc ile gerçekleşmektedir. For çevriminin altında yer alan (;) işareti for çevriminin bir alt işlemi olmadığını göstermektedir.

SATIR SAYMA

Karakter sayma programına ufak bir ek yaparak satır sayma işlemini gerçekleştirebiliriz. Bildiğiniz gibi her satır sonu newline ' ' karakteri ile gösterilmektedir. Bu karakter ENTER veya RETURN tuşlarının ASCII koduna da karşılık düşmektedir. Bu açıklamalardan sonra programı yazalım:

main ( ) / * satır sayıcı program*/
|
int c,nl
while ((c — getchar ( )) ! - EOF)
nm”)
printf nl) ;
|

While çevrimi ile işlem getchar( ) != EOF olana kadar devam etmekte while çevrimi içinde bulunan if

4 Anl ;

işlemi ile newline karakterler * nl ile sayılmaktadır. If şartı (c — — * çeşit newline koşulu süresince * 4 nl sayma işlemini gerçekleştirmektedir. “$” ifadesinin tek karakter uzunluğunda olduğunu tekrar söyleyelim. ifadesi arkadan gelen karakterin kontrol karakteri olduğunu göstermek için kullanılır.

Şimdilik hoşçakalın... O 61

Pur