Bu sayfadaki yazılar
Sayfanın metni
Sayfa 57
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.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 56
“B-E kanal araç track
Makina dili programlar belli adreslerde çalıştığı için, programın hangi buffer'a doldurulacağı da önemli. 0-3 arası buffer'lar 1541'in içinde $300- $7FF (768-2047) adresleri arasını kaplarlar ve 256'şar byte uzunluktadırlar. Örneğin 2 numaralı olan $500- $5FF arasını kaplar. Eğer disketinizde 19/02 blokunda bu adres aralığında çalışacak bir makina dili program varsa, aşağıdaki program onu yükleyip çalıştıracaktır (isterseniz gerçekten denemeyin...):
10 OPEN 1,8,15 20 OPEN 3,8,2,* 42” 30 INPUT #1,A 40 IF THEN PRINT “BUFFER DOLU!”': GOTO 60 50 PRİNT # 1,“B-E 2 0 19 02” 60 CLOSE 3 70 CLOSE |
MEMORY-READ (M-R) Bu bellek okuma komutu ile, 1541? in ROM ve RAM'indeki bilgileri okuyabilirsiniz. Formatı:
“M-R CHRS(LO) CHRS$(HI)”
Örneğin 1541'in RAM'inin 762 ve 764 numaralı adreslerinde o an içeride bulunan disketin kaç boş blokunun olduğu yeralır. İsterseniz onu okuyalım:
10 OPEN 1,8,15,*1” 20 A— 762 30 HI—INT(A/256) 40 LO— A-256*HI 50 PRİNT.#1,“M-R”; CHRS(LO);CHRS$(HI) 60 1,A$ 70 Al - ASC(A$ 4 CHR$(0)) 80 A—764 90 HI—-INT(A/256) 100 LO — A-256*HI 110'PRİNT #1,“M-R”; 120 GET # 1,B$ 130 A2 — ASC(B$ 4 CHR$(0)) 140 PRİNT Al -256*A2 150 CLOSE 1
Artık programın incelenmesini size bırakıyorum. Bu komuta bir parametre daha ekleyerek kaç byte okumak istediğinizi de belirtebilirsiniz. Onu da aşağıdaki örnek ile görelim. Bir disket initialize edilince, disketin adı $780'den itibaren 1541'in belleğine yazılır. $790'ü LO/HI olarak ayırırsak 144/7 elde ederiz.
10 OPEN 20 PRİNT CHRS$(7);CHRS(16) 30 INPUT #1,A$ 40 CLOSE | 50 PRINT A$
Görüldüğü gibi, okunacak byte miktarı gönderilince, GET ## yerine INPUT & kullanabiliyoruz.
MEMORY-WRITE (M-W)
Bu komutla da, 1541'in RAM'indeki bazı bilgileri değiştirme imkânı vardır. Genel formatı:
“M-W CHRS$(HI) CHRS(datal) CHRS(data2)....”
LO ve HI ile M-R'de olduğu gibi RAM'daki adresi belirtiyoruz. Adet parametresi, arkadan kaç byte yazılacağını belirliyor. En fazla 34 olabiomut kanalı en fazla 40 arakter kabul eder. Bunun ilk altısı komutumuzun altı karakteri tarafından kullanılır.
lir. Bunun nedeni komut kanalının en fazla 40 karakter kabul etmesi ve bunun ilk altısının komutumuzun ilk altı karakteri tarafından kaplanması. Bir örnek görelim. Disketin araç numarası (yani 8) 119/120 adreslerinde saklanmaktadır. 119'da 120'de de 84 64 — 72 vardır. Bunu değiştirerek, 1541'e başka bir araç numarası ile hitap edebiliriz. Örneğin bunu 8 yapalim:
10 OPEN 1,8,15 20 PRİNT #1,“M-W”; 19);CHR$(0); CHRS(2);CHR$( 32); CHR$(9 4 64) 30 CLOSE | 40 OPEN 1,9,15 50 PRİNT # 1,“1” 60 CLOSE 1
Artık her türlü işlemde 8 yerine 9 kullanmanız gerekecek. Tabii, 1541'i kapatıp açarsanız tekrar eski haline döner.
MEMORY-EXECUTE (M-E)
Bu komutla da, 1541'in RAM'inde veya ROM'unda olan bir programı çalıştırabilirsiniz. Formatı:
“M-E CHRS$(LO) CHRS(HI)”
Örneğin, 1541'in işletim sisteminde $EFC9 adresinde 72 numaralı DISK FULL mesajını gönderen rutin vardır. Bunu çalıştıralım:
10 OPEN 1,8,15 20 PRİNT CHR$(201)CHRS(239) 30 INPUT #1,A,A$,B,C 40 PRINT A,A$,B,C 50 CLOSE |
İstediğimiz mesajın oluştuğunu göreceksiniz.
USER (U)
Bu komut, kullanıcının belli adreslere yerleştirdiği bir programı otomatik olarak başlatmasını sağlar. Formatı:
Buradaki X yerine A-J arası bir harf veya 1-9 arası bir rakam veya “U” gelebilir. Her defasında da başlatılacak programın başlangıç adresi aşağıdaki tablodaki gibi olur:
A VEYA U1 - $CD5F B VEYA U2 - $DC97 C VEYA U3 - $0500 D VEYA U4 - $0503 E VEYA U5 - $0506 F VEYA U6 - $0509 G VEYA U7 - $050C H VEYA U8 - $050F I VEYA U9 - $FF01 J VEYA U: - $EAA0
U1/U2 (veya UA/UB) komutlarını biliyoruz. Diğerlerinden bizim için ilginç olan UJ. Çünkü bu, 1541'i açılış durumuna getirecek RESET'i yapıyor.
10 OPEN 1,8,15 20 PRİNT #& i,“UJ” 30 FOR Il TO 1000 40 NEXT | 50 INPUT #$ 1,A,A$,B,C 60 PRINT A,A$,B,C 70 CLOSE |
30-40 arasında reset işleminin bitmesini bekliyoruz. Sonra da hata kanalını okuyoruz. Gelen mesajın 73, CBM DOS V2.6 1541,00,00 olması gerekiyor. Hoşçakalın...