AMIGA BASIC
Retro bilgisayar
Merhaba... Hatırlarsanız geçen ay BASIC dersimizi GET komutu ile bitirmiştik. Bu ay BASIC'in yeni bir dallanma komutu ile devam ediyoruz.
GOSUB..... RETURN KOMUTU:
GOSUB satır
RETURN [satır]
Program içindeki bir alt rutine atlamak ve geri dönmek için kullanılan komuttur. Bir alt rutin GOSUB ile çağrıldığında, Amiga Basic GOSUB satırının bulunduğu yeri not eder ve sonra belirtilen satıra dallanır. Bu alt rutinde bir RETURN komutu bulursa ve RETURN komutunda herhangi bir satır belirtilmemişse, GOSUB komutunun bulunduğu satırı takip eden satırdan itibaren çalışmasını sürdürür. RETURN komutunda satır belirtilmişse, Amiga Basic buradan belirtilen satıra atlar.

GOSUB ve RETURN yönergelerinde verilen satır, programın dallanacağı alt rutinin ilk satırının satır numarası ya da etiketidir.
Bir alt rutin program içinden birkaç kez çağırılabileceği gibi, bir başka alt rutin içinden de çağrılabilir. Bu tür iç içe geçmiş alt rutinler sadece bellek miktarı ile sınırlıdır.
RETURN komutundaki satır seçeneği, geri dönüşün GOSUB komutunu takip eden satırdan değil de başka herhangi bir satırdan devam etmesi istendiğinde kullanılır. Komutun bu formatı dikkatli kullanılmalıdır. Zira bir diğer GOSUB, WHILE ya da FOR yönergesi aktif iken aynı anda sizin GOSUB'ınız da aktif olur. Bunun sonucunda da döngüler ya da diğer alt rutinler yanlış yerlerde sonlanabilir ve Amiga Basic'in "FOR WITHOUT NEXT" (NEXT'siz FOR) ya da "WHILE WITHOUT WEND" gibi hata mesajları vermesine sebep olur.
Alt rutinler, programın herhangi bir yerine yerleştirilebilir. Ancak ana programdan ayırt edilebilir bir şekilde yerleştirilmesi daha uygundur. Alt rutine istenmeyen girişleri önlemek için, alt rutinin başlangıcından önce STOP, END ya da GOTO yönergeleri ile program akışı kontrol edilmelidir.
Programda kullanılan GOSUB yönergesi sayısı ile RETURN sayısı aynı olmalıdır. Yani her GOSUB için ona ait bir RETURN yönergesi bulunmalıdır. Aksi takdirde programınız hata mesajı verecektir.
Komutların çalışmasını aşağıdaki örnek programda inceleyin:
'Yazı stili
DEFLNG a-Z
LIBRARY "graphics.library"
DECLARE FUNCTION AskSoftStyleO LIB-
RARY
'Geçerli stil seti
Allowed%=AskSoftStyle(WINDOW(8))
'Görüntüle
GOSUB StilYap
LIBRARY CLOSE
END
StilYap:
FOR i=0 TO 7
CALL SetSoftStyle (WINDOW (8), i, Allo-
wed%)
'Bitleri kontrol et
IF i=0 THEN CALL PrintMsgfplain ")
IF (i AND 1) THEN CALL PrintMsgfboldface ")
IF (i AND 4) THEN CALL PrintMsgfitalic ")
PRINT
NEXT
'Normale dön
CALLSetSoftStyle(WINDOW(8),0,255)
RETURN
SUB PrintMsg(msg$) STATIC
CALL Text (WINDOW(8) ,SADD (msg$),
LEN (msg$))
END SUB
Program, yazı stilini değiştirmek için yazılmış. Stil değiştirmek için kullanılan alt rutin ve programların çoğu library rutinlerinden çağrılıyor. GOSUB ile gönderilen StilYap rutini değişik stilleri gösteren yazıları görüntüleyerek RETURN komutuyla GOSUB satırının altındaki komuttan itibaren çalışmasına devam etmektedir.
GOTO KOMUTU:
Kullanım Şekli:
Bu komut, programın belli bir satıra dallanarak çalışmasına oradan devam etmesini sağlar.
satır, satır numarası ya da etiket olabilir. Program komutu takip eden satır belirtecinde istenen satıra atlayarak çalışmasına oradan devam eder. Satırda çalıştırılabilir bir yönerge varsa o işlemi yapar; DATA ya da REM gibi işlevi olmayan bir satırsa, buradan sonraki çalıştırılabilir ilk satırdan itibaren çalışmasını sürdürür.
Genellikle dallanma işleminde GOTO yerine ON..GOTO, IF..THEN..ELSE gibi yapısal kontrollerin kullanılması tavsiye edilir; çünkü programda çok sayıda GOTO olması, programın incelenmesini ve hata ayıklanmasını zorlaştırır.
Diyelim ki kullanıcıdan Evet ya da Hayır şeklinde cevap isteyen ve bu cevaba göre çalışmasına devam eden bir programda GOTO kullanalım: 100 IF A$="E" THEN PRINT "EVET.":GOTO 120 110 PRINT "EVET DEĞİL." 120 REM PROGRAM BURADAN DEVAM EDİYOR.... Aynı işlemi IF..THEN..ELSE ile yaparsak problemi tek satırda halledebiliyoruz: 100 IF A$="E" THEN PRINT "EVET." ELSE PRINT "EVET DEĞİL."
Programda bunun gibi pek çok dallanma olduğunu düşünürseniz, programın ne kadar uzayacağını kestirmek fazla zor değil. Tabii ki programlarınızın içinde bu komutu yine de oldukça sık kullanmanız gerekecek.
HEX$ KOMUTU: Kullanım Şekli: HEX$(değer) Bu fonksiyon, ondalık bir sayının onaltılık
AMIGA BASIC
Kullanım Şekli:
GOTO satır karşılığını verir, değer, -32768 ile 65535 arasında bir sayı olabilir ve HEX$(değer) işleminden önce yuvarlanır. Örneğin;
PRINT HEX$(60037) komutu, EA85 sonucunu verir.
IF..GOTO IF..THEN..ELSE IF..THEN..ELSE Blok
KOMUTLARI
Kullanım Şekli: 1. IF ifade GOTO satır [ELSE yönerge] 2. IF ifade THEN satır [ELSE yönerge] 3. IF ifade THEN yönerge [ELSE yönerge] 4. IF ifade THEN yönerge blok'u......
ELSE yönerge blok'u......
ELSEIF ifade THEN yönerge blok'u......
ENDIF
IF..THEN yönergesi, belli koşulları kontrol ederek sonuca göre ya programın takip eden satırlarını çalıştırır ya da programın belirtilen bir başka bölüme dallanmasını sağlar. Kullanım şekillerinde gördüğünüz gibi birçok farklı kullanımı vardır. En basit kullanım 1., 2. ve 3. formlardır. Bir örnek ile açıklayalım: IF a<10 THEN PRINT "a, 10'dan küçüktür"
ifade, genellikle fiziksel bir koşulun karşılaştırmasıdır. Belirtilen koşul karşılaştırıldığında sonuç doğruysa, Amiga Basic -1 (doğru) değerini; yanlışsa, 0 (yanlış) değerini alır ve eğer sonuç -1 ise (doğruysa) ekrana "a, 10'dan küçüktür" yazılır. Sonuç yanlışsa, program bir alt satırdan itibaren çalışmasını sürdürür. Komut, ELSE ile genişletilebilir:
IF a<10 THEN PRINT "a, 10'dan küçüktür"
ELSE PRINT "a, 10'dan küçük değildir"
Bu ilave ile program koşulun yanlış olduğu durumda ELSE ile verilen işlemi yapar ve ekrana "a, 10'dan küçük değildir" yazar. Komutta THEN ve takip eden komutun yerine bir GOTO ve satır numarası ya da etiket konulabilir. Yani:
IF a<10 GOTO koşul 1 ELSE GOTO 250
IF/ELSE IF/ELSE/END IF yapısı kullanılarak birden fazla koşul karşılaştırması yapılabilir. Biraz önceki formatta THEN'den sonra başka bir karşılaştırma imkanı olmadığını düşünürseniz, bu yeni kullanım çok işe yarayacaktır. Birinci koşulun doğru olmadığı durumlarda ELSE IF....THEN satırı ile ikinci koşul karşılaştırması yapmak mümkündür. IF ELSE IF/ELSE yapısı, END IF komutu ile sona erer. Bu yapıyı birbiri içine geçmiş olarak vermek mümkündür. İsterseniz sadece bu komutu kullanarak 3 sayıyı karşılaştırıp en büyüğünü bulan basit bir program yazalım::
a=4:b=6:c=11
IF a<b THEN
IF a<c THEN
IF b<c THEN
PRINT "en büyük c"
ELSE
PRINT "en büyük b"
ENDIF
ELSE
PRINT "en büyük b"
ENDIF
ELSEIF a<c THEN
PRINT "en büyük c"
ELSEIF a>b THEN
PRINT "en büyük a"
ENDIF
Programda verdiğiniz a, b ve c değerlerini değiştirerek denemeler yapabilir, hatta yeni bir mantık kurup kendi programınızı oluşturabilirsiniz. Deneyin.
Örneklerle açıklamaya çalıştığımız kullanım şekillerinin bağlı olduğu kuralları maddeler halinde aşağıdaki listede bulabilirsiniz:

1., 2. ve 3. format için: . ifade sonucu doğru ise, program ya satır ile belirtilen satıra dallanır ya da THEN'den sonraki yönerge'yi yerine getirir.
. ifade sonucu yanlış ise, GOTO ve THEN ile verilen işlem yapılmaz; eğer varsa, ELSE'ten sonraki yönerge uygulanır.
. THEN ve ELSE'ten sonraki yönergeler iç içe geçebilir, bu birçok Amiga Basic yönerge ve fonksiyonunu içeren komut girebilmenizi sağlar. Ancak 1., 2. ve 3. formlar bir satırı aşamazlar.
. THEN'den sonra, bir Amiga Basic yönergesi ya da satır numarası veya etiket belirtilebilir.
. GOTO her zaman satır numarası ya da etiketi ile verilir.
. Yönergede THEN ve ELSE aynı sayıda değilse, her ELSE en yakın THEN ile uyumlaştırılır.
. Bir IF..THEN yönergesi bir satır numarası ya da etiketine atlama yapıyorsa ve bir Amiga Basic "Undefined line number" hata mesajı verirse, gönderilen satır bulunamamış demektir.
4. Kullanım şeklinde bunlardan farklı kurallar da şunlardır: Yönerge bloğu iç içe geçmiş IF-THEN-ELSE bloklarından oluşabilir. Amiga Basic iç içe geçmiş yönergeler için tek satır sınırı koymaz; yönerge bloğu bir ya da daha çok satırdan oluşabilir.
. Bir ifade doğruysa, karşılık gelen THEN yönerge blok'u çalıştırılır ve program END IF yönergesini takip eden ilk yönergeye giderek çalışmasını sürdürür.
. Hiçbir ifade doğru değilse; ya program END IF'ten sonraki ilk yönergeden devam eder ya da varsa ELSE yönerge blok'u devreye sokulur ve program yine END IF'ten sonraki ilk yönergeden çalışmasını sürdürür.
. ELSE-IF blok'u opsiyoneldir. Amiga Basic bu konuda herhangi bir limit koymaz.
. ELSE blok'u da seçimliktir. . Satırda THEN yönergesinden sonra herhangi bir şey yazılmışsa, Amiga Basic bunun tek satırlık bir IF-THEN-ELSE yönergesi olduğunu düşünür.
INKEY$ KOMUTU:
Kullanım Şekli: INKEY$
Bu komut klavye buffer'ından bir karakter okur ve onu tek karakterlik bir yazısal dizi olarak geçirir. Herhangi bir karakter girişi yapılmazsa, buffer boş kalır ve INKEY$ boş bir karakter geçirir. Burada programı durduran Amiga+nokta tuş kombinasyonu haricinde tüm tuşlar kullanılabilir.
INKEY$ komutu ekrana herhangi bir karakter yazmaz, sadece karakteri geçirir.
Tus:
a$=INKEY$
INPUT "Devam edecek misiniz (E/H)? ",a$
a$=UCASE$(a$)
IF a$<>"" THEN
IF a$="E" GOTO Yaz
IF a$= "H" THEN END
BEEP
ENDIF
GOTO Tus
yaz:
PRINT Merhaba"
GOTO Tus
Örnek programımız, ekrana "Devam edecek misiniz (E/H)? " yazarak sizden cevap bekliyor. Cevap olarak tek karakterlik bir harf giriyorsunuz. Harf girmezseniz, aynı soruyu yineliyor, E veya H dışında bir harf girip Return'e basarsanız, bip sesi çıkarıp tekrar soruya dönüyor. UCASE$ fonksiyonu, girişi küçük harf yapsanız bile büyük harfe çeviriyor. "E" cevabı verirseniz, ekrana "Merhaba" yazıp soruya dönen program, "H" cevabı ile sona eriyor.
INPUT KOMUTU:
Kullanım Şekli: INPUT[;] ["uyarı mesajı";] değişken-listesi
INPUT komutu, programın çalışması esnasında kullanıcının klavyeden değerleri girebilmesini sağlar. Girilen değerler daha sonra program tarafından ilgili değişkenlere atanırlar. Program çalışırken bir INPUT yönergesi ile karşılaştığında durur ve uyarı mesajı yazılmamışsa bir soru işareti görüntüleyerek girişi bekler, uyarı mesajı'nı yazmak, özellikle uzun programlarda kullanıcının hangi bilgiyi gireceğini göstermesi bakımından çok yararlıdır. Mesajı takip eden “;” yazıdan sonra soru işareti koyar. Noktalı virgül yerine virgül koyulursa, soru işareti yazılmayacaktır.
Bir INPUT komutuyla değişken-listesi olarak sıralanan birçok değişkene değer atamak mümkündür. Değişken isimleri aralarına virgül koyularak sıralanırlar. INPUT komutundaki değişken isimleri ile giriş sayısı birbirinden farklıysa, "?Redo from start" hata mesajı görüntülenecektir. Aynı mesaj değişken türü sayısal iken giriş yazısal yapıldığında da ortaya çıkar. Bu mesajın anlamı, girişin yeniden yapılması gerektiğidir.
INPUT komutundan hemen sonra uyarı mesajı'ndan önce koyacağınız noktalı virgül, kursorun alt satıra geçmeyip girilen bilginin son karakterinden hemen sonra beklemesini sağlar. Bu durumda sonraki çıktı aynı satırda buradan itibaren yazılacaktır.
INPUT "ADINIZ NE? ";a$
PRINT "Merhaba ",a$
INPUT;"ADINIZ NE",a$
PRINT " MERHABA...."
INPUT$ KOMUTU: Kullanım Şekli: Değişken=INPUT$(uzunluk[,[#]dosya-no)
Bu komut, sırasal dosyalarda kullanılır. dosya-no ile belirtilen dosyadan, istenen uzunluk'ta bir yazısal dizi okur. dosya-no belirtilmemişse, INPUT$ istenen uzunlukta karakteri klavyeden okur. Girişler klavyeden yapılırsa, ekrana hiçbir karakter yazılmaz. Klavyeden bilgi okuma işlemine Return tuşuna basılana kadar devam eder. İşlemi kesmenin tek yolu, Ctrl+C tuşlarına basmaktır. Byte'ları INPUT$ ile okuduktan sonra, CV* fonksiyonlarını kullanarak sayıya çevirebilirsiniz.
İsterseniz, INPUT$ ile klavyeden bir fonksiyon tuşu okuyarak ekrana yazdıran bir program deneyelim:
PRINT "F1-F10 tuşlarından birine basın"
Oku:
FT$=INPUT$(1)
t=ASC(FT$)-128
IFt<lORt>10THENOku
PRINT t", fonksiyon tuşuna bastınız"
INPUT# KOMUTU: Kullanım Şekli: INPUT #dosya no,değişken listesi
Bu komut, normal ekran INPUT'u gibi çalışır, fakat değişkenleri ve yazısal dizileri ekran yerine bir dosyadan okur. Dosya diskette var olan bir dosyadır ve data girişi yapılarak bilgiler PRINT# ya da WRITE# ile dosyaya yazdırılmıştır. Okuma işlemi için, dosyanın INPUT# komutundan önce açılmış olması gerekir.
INPUT#, dosyadaki kayıtları sırayla bir sonraki kayıt aşamasına erişene kadar teker teker okur. Bu komut; boşlukları, virgülleri, Return'leri (CHR$(10)) ve linefeed'leri (CHR$(13)) kayıt ayırıcısı olarak tanır. Boşluklar, yazısal dizilerin alan ayırıcısı olarak tanımlanmamıştır. Yazısal dizi içinde virgül kullanmak isterseniz, bu bilgileri tırnak işaretleri arasında girmelisiniz.
Aşağıdaki programı inceleyin:
INPUT "Adınız ";A$
INPUT "YAŞINIZ ";y
ÖPEN "TEST" FOR OUTPUT AS #1
PRINT#1,N$
PRINT#1,Y
CLOSE1
ÖPEN "TEST" FOR INPUT AS #1
INPUT#1,Y:PRINTY
INPUT#1,N$:PRINTN$
CLOSE1
Evet... Bu aylık da bu kadar. Gelecek ay görüşmek üzere, hoşçakalın.