SIMONS' BASIC (3)

İşte dört aylık mutlu beraberliğimizin sonuna geldik. Artık SIMONS' BASIC'in son sırlarını da öğreneceksiniz. Önce programlara veri getirilen yeniliklere bir bakacağız. Derken sıra ekranı şenlendirmeye, hatta hareket ettirmeye gelecek. Yazı dizilerini değiştiren bazı yeni komutlar olduğunu göreceğiz. Karşımıza ikide birde çıkan ERROR mesajlarına nasıl dur diyeceğimizi öğreneceğiz. Ve son olarak da COMMODORE 64 ile çevre birimleri arasındaki bilgi alışverişinin SIMONS' BASIC'de nasıl olduğunu inceleyeceğiz.

Veri Giriş Çıkışı

Çözünüz bugüne kadar, ekranda istenilen bir noktaya yazı yazmak için bir emir olmadığından yakınmışsınızdır. Artık var. PRINT AT(kolon,satır)... ile istediğiniz satır ve kolona yazınızı getirebilirsiniz. Hatta şöyle bile yapabilirsiniz:

10 A$- AT(3,6) 4 “COMMODORE”
20 PRİNT A$

Ancak bu son numarayı sadece program içinde çekebilirsiniz. Peki, bir yazıyı o anda ekranda yazılı olan satırın, örneğin üç satır altına yazdırmak isterseniz ne olacak? Bunun için de LIN değişkeni var. Bu değişken daima o anda cursor'un bulunduğu satırın numarasını taşır. Böylece deminki problemi, PRINT AT (kolon, LIN+3) ile halledebiliriz. Bir diğer komut da, yazımızı ekran satırında tam ortaya yazabilmemizi sağlar. CENTRE olan bu komut, tıpkı PRINT gibi kullanılır. Ancak arkasından gelenleri, yazının yazılacağı satır içinde ortalar. Bir ufak kusuru var. Yazma işlemi bittikten sonra alt satıra geçmiyor, sanki sonunda noktalı virgül olan PRINT gibi davranıyor. Bu nedenle eğer alt satıra geçmek isteniyorsa, bir CENTRE komutunun bitiminde, bir de PRINT yapmak gerekir.

Gelelim sayıların yazımına. Duymuşsunuzdur, bazı bilgisayarlarda PRINT USING gibi komutlar vardır ve basılacak sayıların görünüşlerini etkilerler. SIMONS' BASIC de bu işe

USE komutu ile bir çözüm getirmiş. USE görünüş, sayı ile işimizi hallediyoruz. Ancak “sayı” parametresinin yerinde STR$(sayı) olmalı. Özelliklerine gelince. Bu da bir karakter dizisi. # işareti bir sayıyı simgeliyor. “.” işareti ile ondalık noktayı belirtiyoruz. Bunun dışında yeralan her karakter aynen basılıyor. Örneğin USE “### TL”,STR$(100.567) sonucunda “100.57 TL” elde edilir. Gördüğünüz gibi, sayının kesilen kısmı bir önceki haneye yuvarlanarak geçiriliyor. USE da tıpkı CENTRE gibi bir alt satıra inmez, olduğu yerde kalır.

Verileri bastırırken nasıl kontrol edebiliyorsak, okurken de edebilmeliyiz. FETCH işte bu işi yapıyor. FETCH “kontrol dizisi”, uzunluk, değişken ile sadece istediğimiz karakterlere sahip ve en fazla belirlenen uzunlukta okuma yapabilir, böylece kullanıcının programımıza yanlış veri vermesini önlemiş oluruz. Ekrandan karakterler okunur. Bunlardan üçü özel karakterlerdir. Eğer HOME tuşuna basmışsanız, bu sadece harfler geçerlidir anlamına gelir. CRSR-aşağı tuşu ile, tüm sayılar ve harfler dışında kalan karakterler kullanılabilir hale gelir. CRSR-sağa tuşu ile de, sadece harfler ve SHIFT+harfler geçerli olur. Örneğin sadece harflerin ve 1 rakamının kullanılmasını istiyorsak, “kontrol dizisi” içinde HOME tuşu ve 1 rakamı bulunmalıdır. FETCH de bir öncekiler gibi alt satıra inmez. Ayrıca veri beklenirken soru işareti çıkmaz ve cursor yanıp sönmez. Yazdığınızı silmek için sadece DEL tuşunu kullanabilirsiniz, CRSR tuşları işe yaramaz. Belirtilen uzunluğun son karakterini de verdikten sonra, DEL tuşu da işe yaramaz; size sadece RETURN'e basmak düşer. Siz en iyisi bir PAUSE yazıp, ondan sonra 3 saniye beklemeye geçecektir. Yalnız dikkat edin, PAUSE ile mesaj arasında bir boşluk olmalı.

Ekran Hareketliliği

Ekranda iki tür hareketlilikten bahsediyoruz. Biri ekranın bir bölümünün başka bir yere taşınması, diğeri de belirlenen bölümün kendi içinde hareket etmesi. MOVE satır1,kolon1,x,y,satır2,kolon2 ile, ilk belirlenen dikdörtgen alan, sol üst köşesi satır2,kolon2 olacak şekilde kopyalanır. Gene her iki bölümün de ekrana sığması gerektiği malum... Diğer türdeki hareketliliği sağlayan komutlar birbirine çok benziyor. Bu nedenle birini açıklayıp, diğerlerini ona göre anlatacağız.

DOWNW satır,kolon,x,y ile belirlenen alan içinde kalan ekran kısmı, bir satır aşağı kaydırılır. Ancak dikdörtgenin veri değişmez ve dikdörtgenin son satırında bulunan yazı en üst de örnek programımızı inceleyin. INKEY değişkeni, devamlı olarak klavyeyi okur ve o anda basılı olan fonksiyon tuşunun numarasını taşır. Bu 1-16 arası bir sayıdır. Eğer o anda bir fonksiyon tuşu basılı değilse, içeriği sıfır olur.

Bir başka komut, DATA'ların okunması ile ilgili. RESTORE komutu, DATA'ları baştan okumaya yarar. Ancak aradaki satırlardan birinde başlayan bir DATA'yı tekrar okumak çok zordur. Fakat şimdi, RESET satır no ile istediğiniz satırdan DATA'ları okumaya başlayabiliriz. Bir ufak komut da, programın belli bir süre beklemesiyle ilgili. PAUSE 10 dediğinizde bilgisayar 10 saniye bekleyecektir. Eğer PAUSE “merhaba!!”,3 derseniz de, ekrana merhaba satırında ortaya çıkar. Yani bu komutu bir FOR..NEXT döngüsü içinde kullanırsanız, belirlenen dikdörtgende yukarıdan aşağı doğru bir rotasyon elde edersiniz. DOWNW yerine DOWNB kullandığınızda, aşağıdan kaybolan satır yukarıdan ortaya çıkmayacak, üst satır boşalacak ve böylece bu komut tekrarlandığında o bölge bir süre sonra boş kalacaktır. Yukarıdaki işlem sağa, sola ve yukarı doğru da yapılabilir. Bunun için UPB veya UPW (yukarı), LEFTB veya LEFTW (sola), RIGHTB veya

RIGHTW (sağa) kullanılır.

Karakter Dizileri

Gelelim yabancıların string dedikleri karakter dizilerine. Eskiden beri eksikliğini çektiğiniz emirlerin bir kısmını SIMONS' BASIC'de bulabileceksiniz. Örneğin DUP(string,tekrar) ile, önceden belirlenmiş string'i “tekrar” kadar kendine eklemiş olursunuz. Örneğin A$=DUP(“A”,5) ile A$=“AAAAA” olur. Yalnız dikkat edin, tekrar*LEN(string) yani sonucun uzunluğu en fazla 255 olmalı. A$=INSERT(string1,string2,pozisyon) ile, string2'nin içine string1'i verilen yerden itibaren ekler. Örneğin A$=INSERT(“XXXX”,“RIZA”,3) ile A$=“RIZXXXXA” elde edilir. Pozisyon'un değeri LEN(string2)'den küçük olmalıdır. Sıfır olabilir. Bu durumda string1, string2'nin başına eklenir. A$=INST(string1,string2,pozisyon) da deminki işi yapar, ancak bu arada string2'nin string1 tarafından kaplanan kısmı ortadan kalkar. Örneğin A$=INST(“XX”,“RIZA”,1) ile A$=“RXXA” ortaya çıkar. Pozisyon için 0-LEN(string2) arası değerler geçerlidir. Son durumda string1, string2'nin sonuna eklenir.

Ekran Komutları

Ekran komutları başlığı altında, ekrandaki renkleri ve karakterleri etkileyen değişik komutları inceleyeceğiz. Örneğin COLOUR renk1,renk2 ile ekran ve çerçeve rengi belirlenebilmekte. “renk1” ile çerçeve rengi, “renk2” ile de ekran rengi verilmekte. Her biri 0-15 arasında olmalı. Daha önceden bu işlem POKE 53280,renk1: POKE 53281,renk2 ile yapılıyordu. Ekran çerçevesinin iki renk arasında belli bir hızla gidip gelmesini ve bu işin programdan bağımsız olarak yürümesini BFLASH hız,renk1,renk2 sağlıyor. İşlem BFLASH 0 ile durdurulmakta. Karakterlerin yanıp sönmesini de FLASH renk,hız sağlar. Ekrandaki belirtilen renge sahip tüm karakterler verilen hıza göre yanıp sönmeye başlar. Bu işlemi de OFF komutu sona erdirir. Son iki komuttaki hız parametresi 1-255 arasında olmalıdır ve 1 en hızlı yanıp sönmeyi sağlar. Bir de ekranda dikdörtgen biçimindeki alanları etkileyen komutlar var. Örneğin INV satır,kolon,x,y komutu ile, sol üst köşesi verilen satır ve kolonda olan, “x” kadar genişliğe ve “y” kadar da yüksekliğe sahip dikdörtgen alan negatif hale gelir. FCHR satır,kolon,x,y,kod dediğinizde, belirlediğiniz dikdörtgenin içi “kod” ile ekran kodunu (0-255) verdiğiniz karakterle doldurulur. FCOL satır,kolon,x,y,renk ise verdiğiniz dikdörtgen alanı belirlediğiniz renk (0-15) ile kaplar. FILL satır,kolon,x,y,kod,renk ise yukarıdaki iki komutu birleştirir. Verilen alanı hem renk, hem de karakter ile kaplar. Yukarıdaki komutların hepsinde belirlenen dikdörtgenin tamamen ekrana sığması gerektiği söylemeye gerek yok sanırız. Bir diğer komut, her karakterin farklı zemin rengine sahip olabilmesini sağlar. BCKGNDS renk1,renk2, renk3,renk4 ile bu işlem yapılır. Ancak artık karakter setinin sadece ilk 64 karakterini kullanabilirsiniz. “renk”

parametreleri şu zemin renklerini belirler:

renk1:Normal renk2:SHIFT+harf renk3:Negatif karakter (revers) renk4:SHIFT+negatif karakter

Tekrar normale dönmek için NRM komutu yeterli olacaktır. A$=POS(string1,string2) ile de kolayca string2'nin hangi karakterinden itibaren string1'in yer aldığı öğrenilebilir. Yukarıda verdiğimiz tüm komutlar, DUP dışında, sadece program içinde kullanılabilir. Direkt olarak ekrana yazıldıklarında elde edilen sonuçlar oldukça garip olacaktır.

Hata Komutları

Siz de mi, devamlı ERROR mesajları ile programınızın kesilmesinden bıktınız? Çaresi SIMONS' BASIC'de var.

Programın en başında ON ERROR GOTO XXXX komutunu kullanın. ON ve ERROR arasındaki boşluğa dikkat. Artık bir hata ortaya çıktığında bilgisayar işini durdurmayacak ve sizin belirttiğiniz satıra gidecektir. Siz de bu satırda gerekli işlemleri yaparsınız. Eğer artık programın geri kalan kısmında hata çıkmayacağına eminseniz ve ON etkisini kaldırmak istiyorsanız, NO ERROR kullanın. Artık hata olursa program duracaktır. Bu komutu kullanmanız gereken bir yer daha var. Eğer programda ON ERROR'u aktif hale getirmişseniz ve programı da STOP ile durdurmuşsanız veya program bitmişse, NO ERROR komutunu vermeniz gerekir. Yoksa bilgisayarınız bazı gariplikler yapacaktır. ON ERROR'la programı gönderdiğiniz satırda ERRN değişkeninden oluşan hatanın numarasını, ERRLN'den de hatanın oluştuğu satırın numarasını alabilirsiniz. Baktınız, hata çok büyük ve programın durması lazım. O zaman da OUT komutu ile en son oluşan hatanın mesajını verip programı durdurabilirsiniz.

Çevre Birimleri

SIMONS' BASIC gerek yazıcı, gerek disk ünitesi, gerekse paddle, lightpen, joystick gibi çevre birimlerini destekleyen komutlar da içeriyor. Bunlardan COPY, DIR, DISK ve MERGE komutlarını önceden görmüştük. Bunların yanısıra HRDCPY komutu ile, normal yazı ekranını COMMODORE 64'e bağlanabilen herhangi bir yazıcıdan bastırabilirsiniz.

SCRSV ile gene normal yazı ekranını diskete veya kasete kaydedebilirsiniz. Kullanımı tıpkı OPEN komutu gibidir. Örneğin:

SCRSV 1,1,2, “EKRAN”
:REM kasete
SCRSV 4,8,3, “EKRAN,S,W”
:REM diskete

SCRLD ile de yazı ekranı tekrar ekrana yüklenir. Örneğin:

SCRLD 5,1,0, “EKRAN”
SCRLD 9,8,0, “EKRAN,S,W”

Her iki emir de, hangi kanal kullanılırsa kullanılsın, CLOSE 1 yaparlar. Kimi SIMONS' BASIC türleri, ERROR komutu ile disk sürücüsünün hata kanalını okuyup ekrana yazar. PENX ve PENY değişkenleri, lightpen'in o anda ekranda gösterdiği X ve Y koordinatlarını içerirler. A=PENX örneğindeki gibi öğrenilebilirler. A=POT(no) yapıldığında da, birinci port'a bağlı paddle'lardan 'no' numaralı olanın o anki değeri elde edilir. Ya 0'dır ya da 1. İşte geldik son komutumuza... JOY değişkeni de, o anda joystick-2'nin durumunu belirtir. A=JOY ile elde edilecek sayıya göre aşağıdaki anlamları çıkarabiliriz:

0:Kol oynamıyor 1:Yukarı 2:Yukarı sağa 3:Sağa 4:Aşağı sağa 5:Aşağı 6:Aşağı sola 7:Sola 8:Yukarı

Eğer o anda ateş tuşu da basılıysa, sonuca 128 eklenecektir. Kimi SIMONS' BASIC'ler, önceden JOY1 veya JOY2 yapıp okunacak port'u ayarlayıp, sonra JOY değişkeninin kullanılmasını mümkün kılarlar. Örnek programımız da buna göre ayarlanmıştır.

Eveeeeet... Artık bitti. İnşallah işinize yaramıştır ve inşallah SIMONS' BASIC'le artık başınız belaya girmez.

ADI : S.BFLASH
20010 BELASH 10,0,1:PAUSE 5
BELASH 40,2,10:PARUSE &
00030 BELASH 5S
20040 BFLASH &
PROGRAM ADI : S.ON ERROR
ON
FOR TÜ -i STEP -İ
00030 PRİNT "KOK
00040 NEXT I:END
NO ERRÜR
68118 PRINT " HATALI HESAPLAMA, SATIR: "ER
RLN

PROGRAM ADI

FCOL 6,15
90026 FOR 151024 Tü 2023:POKE Iİ,1İ:NEXT
229025 FOR Izi TO R,C,
20832 FÜR Izi TO 180:G0SUB 1İ000:FOR
TO TO 108:NE
XT
00040 END
21000

PROGRAM ADI : S.PAUSE

PRİNT SANİYE B
:PAUSE
SıPRINT TI$
"<RIİGHT>SIMDIİ D
E 8 SANIYE...",SiPRINT TI$

PROGRAM ADI : S.PLACE

POKE 632,34:POKE 633,20
iPOKE "ASF
00020 POKE 632,34:POKE 633,20
198,3:1NPUT "2.KELİMENİZ
20040 PRİNT <3DOLİN>" RUN

PROGRAM ADI :

PRİNT 6,15
FOR Isi TO
FOR Izi TO RNDS)415,
PROGRAM ADI S.NRM-BCKGNDS -COLOUR
209005
60030
00040
CSET iİ:COLOUR 15,15
VEB
T ır
PRİNT "<RYSON>"ASIP
RINT B$:PRIİNT "<RVSON>"B$
>) 4
FOR Isi TO 200:NEKT Aşz"
" THEN 48
NRM
20068

—DEN A

PROGRAM ADI : S.INKEY

THEN 18
IF AND İNT<Cİ/2)-1/2 THEN PRİNT
"SHİFT 18
IF Iİ<9 THEN PRİNT
IF THEN PRİNT
HIFT iğ
PRINT "Cs F"I:60T0 18
22818
"Cz VE 5S
PROGRAM ADI :
00010 POKE 631,34:POKE 632,34:PÜKE 633,20
:POKE 198,3:1NPUT "iİ.KELİMENİZ
00020 POKE 631,34:PÜKE 632,34:POKE 633,20
iPOKE 198,3:1NPUT "2.KELİMENİZ
088030 INPUT "KACINCI HARF "ASİF
) THEN 38
PRİNT RUN
PROGRAM ADI S.INSERT
POKE 631,34:POKE 632,34:POKE 635,20
:POKE "iİ.KELİMENİZ
POKE 631,34:POKE 632,34:POKE 633,20
iPOKE 13938,3:1NPUT "2.KELİMENİZ
A0030 INPUT "KACINCI HARF
THEN 3â
PRİNT RUN

PROGRAM ADI : S.DUP

00010 POKE 631İ,34:PÜKE 632,34:POKE 633,28
198,3:1INPUT "KELİMENİZ
00030 INPUT "KAC KERE";
00040 IF LENCAS)*A>2SS THEN PRİNT "COK UZ
UN
68850 PRİNT RUN

PROGRAM ADI : S.AT

64":B$z"46 ERODOMMOC"
FOR TO
FOR Isi TO 8:PRİNT
KT
FOR
T
FOR
EKT
TÜ
Isi TÜ âT(2041,841)B$:N
PROGRAM ADI : S.CENTRE
00018
20048
DIM
FOR Isi TÜ
FOR Js1 TO
NEXT
b
yu
FOR Isi Tü
RINT
"<CLR>"
"<CLR
PROGRAM ADI
DATA OYNAMIYOR,YUKARI,YUKARI SAĞGA,S
SAĞA,ASAĞI,ASAĞI SOLA,SÖL
A
20020 DATA YUKARI SOLA
20030 DIM TO SiREAD
EXT
INPUT JOYS
TICK J<>1 AND J<282 THEN 48
20050
A$LI)
I-JOY:1F THEN 65
22066
IF 1>8 THEN PRİNT "ATES &
8
6080 A$C1):G60T0 65
PROGRAM ADI : S.RESET
DATA "SATIR 18"
DATA "SATIR 11"
DATA "SATIR
00013 DATA "SATIR 13"
20014 DATA "SATIR 14"
DATA "SATIR 15"
DATA "SATIR 16"
80100 INPUT "SATIR NO 10-16) SNK
18 ÖR SN>1İ6 THEN idüğü
RESET SN:READ A$:PRINT "<RVSON>"AS:
188
PROGRAM ADI 5.USE
INPUT "MİKTARI THEN END
INPUT "PARA BİRİMİ ";TL$
INPUT "VIİRGÜLDEN ÖNCE KAC BASAMAK "
VO
INPUT "YİRGÜLDEN SONRA KAC
"3 VS
00045 A$-""
00050 FOR Izi TÜ
FOR Izi TÜ NEXT
A$zA$4" A
PRİNT #USE
PROGRAM ADI : S.FILL&SCROLL
FCOL
FOR I-1024 TO 2023:POKE Iİ,1:NEXT
20938 FOR Izi TO 300:GOSUR R,C,
*16:NEXT
200486 PRİNT "<CLR>":FCOL
FOR Izi TO 300:6G0SUB R,C,
k256:NEKT
20060 PRİNT "<CLR>"
FOR Izi TO
*16:NEKT
Tü 425
Tada, TO
gğasa IF THEN FOR TÜ
DOLNU R,C,W,D:NEXT :GOTO 340
80100 IF J-2 THEN FOR TÜ RNDC8)415:0D
OLİNB 320
IF THEN FOR TÜ
UPLU R,C,bİ,D:NEKT :GÖTÜ 300
IF J-4 THEN FOR Tü
PB :GOTO 300
Ağ130 IF J-5 THEN FOR TÜ
R,C,W,D:NEXT :GOTO 308
IF J-6 THEN FOR TO
EFTB :GOTO 380
001506 IF J-7 THEN FOR TO RND<8)x100:
RIGHTU :GOTO 300
IF J-0 THEN FOR Iİlzi TO RNDC8)x15:R
R,C,W,D:NEXT :GOTO
20300 NEXT
003393 PRİNT "<CLR>":END
R-RNDCB)

PROGRAM ADI : S.FETCH

PRİNT A-Z ARASI
TUSLARA BASINIZ: "?
FETCH :PRIİNT *
GOSUB
28040 PRİNT A-Z T
gAd5A FETCH iü
Vala)
PRİNT "<DOLİN>ARTIK TUM TUSLARI KULL
ANABILIRSINIZ"
FETCH :P
RINT :GOSUB
PRİNT TUSLARINI
KULLANAIN:
FETCH :PRI
NT :GOSUB iğdü
PRİNT VE İ-2-3 RAKA
MLARINI GİRİN:
FETCH :GOSU
B
201406 PRINT "<DOLİN>SADECE SAYILAR,NOKTA V
E
FETCH "12345678390
:GOSUB
20939 END
21000 PRİNT "<RVSÜN>VYVERDİĞİNİZ YAZI: <RYSÜ