AMIGA&PASCAL

Herkese en içten merhabalar. Umarım ilk üç yazı sonunda Pascal programları hakkında bir fikriniz oldu. Belki bir iki küçük program yazmayı bile denemişsinizdir. Ancak bugüne kadar öğrendiklerimiz daha çok temel şeylerdi. Bu aydan itibaren ise Amiga'da Pascal programları yazmayı öğreneceğiz.

Bu bölümden sonra anlatacağım, yazım kuralları ve emirler Kick Pascal V2.0 için geçerlidir. Diğer Pascal paketlerinde benzer işlemleri yapan komutlar var, ancak her zaman aralarında bir standart bütünlüğü yok. Elimde en çok doküman Kick Pascal için var, bunun yanısıra en kullanışlısı da Kick Pascal (Hi-speed Pascal daha tam olarak elime geçmedi). Kick Pascal'da emirler üç temel grupta toplanıyor. Bunlardan ilki Pascal'ın standart fonksiyonları. İkinci olarak Kick Pascal'a özgü ve Amiga Sistemini kullanan Pascal emirleri var. Üçüncüsü ve en önemlisi ise Library fonksiyonları. Kullanılan emirleri kısaca tanıtmaya çalışacağım. Yalnız bunu yaparken, bir el kitaplığı yapmaktan çok en çok kullanılan emirleri, ne işe yaradıkları ile vereceğim. Örnek programlarla ne işe yaradıklarını daha ayrıntılı olarak sonra inceleyeceğiz. Kick Pascal'da Bazı Sabitler ve Değişkenler:

FromWB (boolean): Belki biliyorsunuzdur, Amiga'da bir programı çalıştırmanın iki yolu var. Bunlardan ilki programın ismini CLI'dan girmek, ikincisi ise Workbench'ten ilgili Icon'a basarak programı çalıştırmak. Eğer bu değişken True değerini almışsa, programınız Workbench'ten çağrılmış demektir. Bu takdirde mutlaka bir pencere açmak zorundasınız. CLI'dan çağrılan bir programın zaten CLI'dan dolayı bir penceresi mevcuttur.

ParameterStr(Str): CLI'dan çağrılan programınıza parametre olarak verilen komutları bu değişkenden okuyup değerlendirebilirsiniz (Mesela dir df0: derken, dir programın adı df0: ise programa kullanıcı tarafından aktarılan parametre oluyor).

ParameterLen(Int): Yukarıda belirtilen String'in uzunluğunu verir.

Mem(array[0..MaxInt] of byte): Bu değişken ile hafıza byte byte tanımlanmıştır, istediğiniz hafıza adresine doğrudan erişmeniz bu emir ile mümkün.

Bunun dışında bazı sabitler aşağıdaki şekilde tanımlanmıştır:

MaxInt = 32767 MaxLong=MaxLongInt=2147483647 MaxCard = MaxWord = 65535 MaxByte = MaxShortCard = 255 MaxShortInt = MaxShort = 127 Pi = 3.14159265358979

Kick Pascal'ın Pascal Fonksiyon ve

Procedure'lerinden bazıları Write/Read: Bu iki emir ile istediğiniz bir çıkış dosyasına/giriş dosyasından, istediğiniz değişkenleri yazabilir ve okuyabilirsiniz.

Writeln / Readln: O an kullanılan girişten (ki genelde ekran olur) bilgi okumak veya yazmak için kullanılır.

ClrScr/Page: Ekranı siler. Gotoxy (x,y): Kursoru x'inci sütuna ve y'inci satıra yerleştirir. Pencerenin sol üst köşesi (1,1) kabul edilir.

Reset(dosya,isim): isim adlı Dosya değişkeni okuma ve yazma amacıyla açılır.

Rewrite(dosya,isim): Yukarıdaki ile aynı amaçlı kullanılır, sadece bu emir dosyayı yeniden yaratır, yani yoksa bu isimli bir dosya açar, şayet mevcutsa bu dosyayı silerek yazar.

Close (dosya): Eğer bir dosyayı açarsanız, mutlaka kapatmanız gerekir. İşte Pascal'da bu işi gerçekleştiren kahraman emir.

IOresult: Bu fonksiyonun sonucu 0 değilse, o zaman son veri alışverişinde bir hata olmuş demektir.

Seek (dosya,yer): Açılan dosyanın belirli bir yerine gitmenizi sağlar. Diyeceksiniz ki benim dosyam: "dosya: file of word;" şeklinde tanımlı. O zaman: "seek (dosya,20);" emri ile dosyanın 20'nci word'üne yani 40'ıncı byte'ına gelirsiniz.

Filepos (dosya): Dosyanın neresinde olduğunuzu belirtir.

Filesize (dosya): Dosyanın toplam boyunu verir. Bu boylar yine dosyanın tanımlandığı büyüklüğe göre verilir. Bu noktada el kitabından kısa bir örnek eklemek istiyorum: Var f:text; begin

reset (f,'DF0:s startup-sequence); 
seek (f, Filesize (f)): 
writeln (f,'echo "Merhabalar!!!"'); 
close (f); 
End.

Bu basit programda f ile bir dosya değişkeni (text) tanımlıyoruz. Daha sonra var olduğunu bildiğimiz bir dosyayı açıyoruz. Seek emriyle filesize komutunda belirlediğimiz dosya sonuna geliyoruz ve buraya Writeln ile bir satır ekliyoruz. Sonra da dosyayı kapatıyoruz. Etkili ve çok basit, Pascal'ı sevmemin baş sebebi bu.

Buffer (dosya,boyut): Dosya için boyut ile belirtilen miktarda ara hafıza kullanılır ve bu sayede okuma, yazma işleri hızlandırılır. Boyut olarak 10000'in üstü gereksiz olacaktır.

Bu emirleri ardından, bilgisayar'ın temel işlevi bilgi saymak, başka deyimle işlem yapmak. Dolayısıyla her dilde mutlaka bazı matematiksel fonksiyonlar olmalı.

Abs: Girilen değeri işaretine bakmadan pozitif değeri olarak atar.

Arctan (x): Reel sayılar üzerinde bir işlemdir. Gerçekleştirilebilmesi için diskette Mathtrans.library dosyasının LIBS: directory'sinde bulunması şarttır.

Chr(i): i sayısının ASCII karşılığını verir. Ord(c): Girilen ASCII kodunun sayı karşılığını verir.

Hatırlarsanız bir ara pointer tipleri tanımlamıştık. Bu pointerlarla ilgili iki

1.0 Pascal ve Amiga versiyonları, Pascal ile neler yapılabilir. 2.0 Pascal'ın genel yapısı: Tanımlar, bloklar, Procedure ve fonksiyonlar 3.0 Pascal Dili Özellikleri, tip tanımları, unitler. 4.0 Amiga ile iletişim: Library kullanımı, Amiga'ya has komutlar. 5.0 Gelişmiş programcılık: teknikler, başka sistemlere veya sistemlerden aktarmalar.

F.Kağan Gürkaynak önemli standart fonksiyon var bunlar

New (pointer)/Dispose (pointer): Dinamik bir değişken tanımlamanızı / sistemden ayırmanızı sağlar.

Kick Pascal'ın Amiga'ya özgü komutlarından bazıları Yavaş yavaş işin Amiga kısmına geldik. Bunun yanında Kick Pascal programcıları bir iki adet de standart dışı fonksiyon geliştirmişler. Buradaki fonksiyonları Pascal ile ilgili kitaplarda bulmak mümkün değil, bunlar tümü ile Kick Pascal'a özgü.

Alloc_Mem (Miktar,durum): Belirtilen miktarda hafızayı kendinize ayırır. Bu hafıza artık sizin programınıza ayrılmıştır. Durum için ise 2 koyarak Chip, $10000 koyarak 0'larla doldurulmuş bir hafıza isteyebilirsiniz. Hemen hatırlatalım, DMA ile ilgili tüm veriler Chip hafızada olmak zorundadır (Grafik, ses, disket datası). Bu yüzden boşu boşuna Chip hafıza harcamamalıyız. Eğer bize ayrılan hafıza önemli değilse, sadece 0 girebiliriz. Ayrılan hafızanın muhakkak iade edilmesi şarttır. Ancak Kick Pascal sistemi bu işi sizin yerinize yapacaktır. Yine de, istiyorsanız ayrılan hafızayı FreeMem (adres,miktar) komutu ile sisteme iade edebilirsiniz.

Open_Screen: Bu komut ile kendinize bir ekran açabilirsiniz. Elbetteki bu ekranın parametrelerini girmeniz gerekecek. Open_Screen (x,y,en,boy,kalınlık,arkaplan rengi, yazı rengi,görüntü türü,isim);

Burada kalınlık'tan kasıt, ekrana ait olan Bitplane sayısı, dolayısı ile kaç renk gösterebileceğidir. Görüntü türlerinin hepsini bir Amiga referansından edinebilirsiniz.

Açılan bu ekran, Intuition Library'si ile açılana göre oldukça basit. Ancak, zahmetsizce yazılarak, programlanabiliyor. Açılan ekranı Close_Screen ile kapatabilirsiniz.

Open_window: ile bir pencere açabilirsiniz. Open_screen komutu gibi bu emir de basit bir pencere açmanızı sağlayacaktır, parametreleri şu şekildedir: Open_window (x,y,en,boy,renk, IDCMP maskesi,pencere türü,ismi,bağlı olduğu ekran,minimum eni,minimum boyu, maksimum eni, maksimum boyu);

Açılan bir pencereyi kolayca CloseWindow komutu ile kapatabiliyoruz.

Biliyorum pek sevimli durmuyor. En iyisi bu konuda örneklere bakmak. Bu konuyu kapsayan bir örnek PROGRAM 1 kutusunda. Benzer örnekler Kick Pascal'ın ikinci disketinde bol miktarda mevcut.

Geldik en önemli emre: OpenLib(pointer,isim,versiyon): Bu procedure ile istediğiniz Amiga Library'sini

AMIGA&PASCAL

açmak mümkün. Burada isim Library ismini, versiyon ise gerekiyorsa o library'nin sahip olması gereken minimum versiyon numarası, eğer önemsizse 0 girilir. Açılan Library sonra CloseLib fonksiyonu ile kapatılabilir, sistem bu işi de aslında otomatik olarak sizin yerinize halledecektir.

Bu 6 emir ile ufkumuz oldukça genişledi sayılır. Bu emirlere ek olarak programcıların eklediği birkaç emir ise şunlar:

FreeStack: Kalan Stack hafıza miktarını gösterir. Stack hafızayı, değişkenler için kullanırsınız. Dolayısıyla sistemde olan hafıza değil de, değişkenler için ayrılmış olan hafızanın miktarı önemlidir.

Random: 0-1 arası rasgele bir sayı verir.

Random (n): 0 ile n-1 arası rasgele bir sayı verir.

Randomize : Rasgele sayı fonksiyonu, zamanla işleme sokulur. Her ne kadar adı rasgele olsa da, bu fonksiyonun belirli bir periyodu vardır. Bu yüzden bu tür bir emre bazı uygulamalarda ihtiyaç duyulur.

Hi(integer): Bir integer veya word türü sayı iki byte'tan oluşur. Bu iki byte'ı bir basamak gibi düşünürseniz, Hi(i) ilk basamağı, Lo(i) ise ikinci basamağı verir.

Bir reel sayı da Trunc (x) ile tam ve Frac (x) ile ondalık kısmına ayrılabilir.

Addr(x): x değişkeninin bulunduğu adres değerini verir.

SizeOf: Belirtilen tipin uzunluğunu byte olarak verir.

sizeof(Word) = 2; sizeof(array[1.. 100] of long) = 400; Exit: Program akışını içinde bulunulan bloktan dışarı çıkartır.

KickPascal'ın bize sağladıkları neredeyse sadece bunlardan ibaret. Ama üzülmeyin, önümüzde büyük bir imkanlar paketi var. Amiga'nın Library'leri. Buna ek olarak programcılar tarafından hazırlanmış bazı unitler (komut paketleri) mevcut. Library'ler ile iletişim sağlarken bazı tanımların yapılması ve bazı değişkenlerin tanımlanması gerekir. Bu tanımlar sabit olarak hazırlanmıştır ve .h ile biten dosyalarda saklanır. Amiga'nın sistemi C ile yazılmıştır. Bu sebeple her türlü Library'si için C dilinde .h file'ları mevcuttur (Bu file'lara Header file denir). Hemen sevinmeyin, zira bu dosyaları kullanmanız mümkün değil, çünkü tanımların Pascal'a uygun olması gerekiyor. Burada tek sorun, bazı C'de büyük ve küçük harfin farklı kabul edilmesinden dolayı aynı isimli değişkenler ve fonksiyonlar bulunabiliyor, bu yüzden bazı isim değişiklikleri mevcut.

Peki bu library fonksiyonlarını nerelerden öğreneceğiz? Bu elbette bizim konumuz değil. Ancak bunu öğrenmenin tek yolu, iyi bir referansa bakmak. Bu iş için çeşitli kaynaklar var, ancak size Commodore'un kendi orijinal referansını tavsiye ederim.

Library Fonksiyonları, device'lar için, Amiga ROM Kernel Reference Manual INCLUDES & AUTODOCS; Amiga'nın sistemi, Library C örnekleri ve program teknikleri için, Amiga ROM Kernel Reference Manual LIBRARIES & DEVICES; Amiga'nın donanımı, teknik bilgi, low level programming için, Amiga HARDWARE Reference Manual kitapları önerilir. Bu kitapların yakın zamanda 2.0 versiyonu için olanları çıktı, onlarda fazladan sürü ile fonksiyon anlatılıyor (1.3 bilgisayar ile onları kullanamazsınız!!). Bu kitapların herbiri oldukça kalın, ama program yazmak, hele Library kullanmak istiyorsanız, özellikle ilki şart. Her üç kitabın da yayımevi ADDISON & WESLEY.

Yazımızın sonunda yine Kick Pascal disketlerindeki örnek programlardan kısaltarak, PROGRAM 2 kutusunda basit bir örnek program veriyorum. Programın ilk satırında, Library için gerekecek iki adet dosyayı sisteme ekliyoruz. Bunlar Graphics.lib ve intuition.h. Dikkat edin: Var kısmında kullanılan Window ve Rastport kelimelerini daha önce görmedik. Bu tipler ilk satırda eklediğimiz dosyalarda tanımlanmışlar. Eğer sistem üzerine kitaplar okuyanınız varsa, bu tanımları bileceklerdir. Daha sonra bir Library açıyoruz. Bu Library, bilgisayarın ROM'unda bulunan Graphics.library. Dikkat ederseniz GfxBase olarak tanımlanan pointer da bizce tanımlanmadı. Daha sonra bir pencere açıyoruz. Pencere açmak aslında Intuition Library'sinin işi; ancak burada, Pascal'ın fonksiyonunu kullanıyoruz, yani basit olanı. Ancak bu arada büyük harfler ile tanımlanmış bazı değerler görüyoruz. Bunlar bizim penceremizin türünü belirliyorlar, dikkat edin virgülle ayrılmıyor, toplanıyorlar, sebebi basit, bunların herbirinin bir değeri var ve her değer pencerenin bir başka özelliğini tanımlıyor. Arkasından enteresan ve kritik bir satır: Rp := Win^.RPort;

Rp değişkeni bir Rastport pointer'ı olarak tanımlanmıştı. Ancak bu değere nereden atama yapılıyor??? Dikkat edin Win, bir pointer ve tipi bir Window gösterecek şekilde tanımlanmıştı. Bizim göremediğimiz tip tanımında Window bir Record olarak tanımlanmış (göremediğiniz lafı yanlış, isteyen bu .h file'ları okuyabilir). Bu record'un bir parçası da Rport. Değeri buradan alıyoruz (tüm bunları anlamak için Amiga'da Window'un yapısını gösteren bir kaynak bulun ve yapıyı anladıktan sonra bir daha okuyun). Aslında şu aşamada tüm bu değerleri anlamanızı beklemiyorum. Ne işe yaradığını anlayarak da çok güzel şeyler yaratabilirsiniz. Hemen sonraki satır çok enteresan. SetAPen (Rp,3); emri, Rastport'u Rp olan pencerenin (bizim açtığımız), yazı rengini 3 numaralı renge çeviriyor. Bu emir Pascal'da yok, Library emri (Autodocs kitabı, sayfa A-108). For döngüsü içindeki iki emir, Move ve Draw için de aynı şey söz konusu. İkinci For döngüsündeki RectFill emri, bir dörtgen çizip içini dolduruyor. Yazı dizimizin ardından bu konularda detaylı örnekler ve uzun açıklamalar vermeyi umuyorum. Özellikle sistem yapılan ve bunların kullanımını gösteren teoriden uzak, programlar yazacağız. Gelecek ay, dizimizin son bölümünü göreceğiz, Burada bazı tekniklere, programlar arası iletişime ve başka sistemlerden program aktarımlarına ilişkin açıklamalar yapacağız. Bu arada lütfen disketlerdeki demo programları inceleyin. Size çok yardımcı olacaklardır. Hepinize iyi eğlenceler ve başarılar.

Var 
Ekran.pencere: ptr; 
PROGRAM
1 
Begin
Ekran :=Open_Screen(0,0,      (Sol üst köşe}
320,256,{Eni,boyu 320x256} 
6,     {Derinlik = 6 = 64 renk} 
3,1,  {Yazı renkleri} 
$0082 {Extra Halfbrite Modu, Derinlik 6 vermiştik}
'Merhaba'); {Bu da ismi} 
Pencere:=Open_Window(50,40, {Sol üst köse}
100,50,     {Eni,boyu} 
$102, {Yazı rengi, $ heksadesimal sayıyı belirtiyor}
0, 
{IDCMP, yok} 
$9, 
{Pencere türü} 
DÜNYA', 
{İsim} 
Ekran,     {Pencere,hangi ekranda ???} 
10,10,200,200);{min'ler ve Max'lar} 
{Burada artık bir ekranımız ve penceremiz var} 
Delay (10*50); {Delay saniyenin 1/50'si kadar bekler} 
Close_Window(Pencere); 
Close_Screen(ekran); 
End.
{$incl "graphics.lib", "intuition/intuition.h" }
Var
Win: * Window; 
Rp: ARastPort; 
PROGRAM 
err: boolean; 
2 
Msg: Ptr; 
I: integer; 
Begin 
OpenLib(GfxBase, 'graphics.library', 0); 
Win:= Open_Window(0, 0, 640, 200,1, _CLOSEWINDOW, 
GIMMEZEROZERO+ACTIVATE+WINDOWCLOSE+ 
WINDOW DEPTH,
Grafikdemosu', Nil, 640, 200, 640, 200); 
Rp:= Wln
^.RPort; 
SetAPen(Rp, 3); 
For i:=0 to 20 Do 
Begin 
Move(Rp, 220+20*i, 5); 
Draw(Rp, 620, 5+9*i) 
End; 
Fori:=1 to 10 do 
Begin 
SetAPen(Rp, 1 + I mod 3); 
RectFill(Rp, 5*i, 75+2*i, 320-25M, 180-8*1) 
End; 
Msg:= Wait_Port(Win
^.UserPort); 
Msg:= Get_Msg(Win
^.Userport); 
Reply Msg(Msg);
Close_Window(Win); 
End.