KICK Pascal
Retro bilgisayarKICK
Tüm Pascal hayranlarına merhabalar. Söz verdiğim gibi bu aydan itibaren köşe haline gelerek her ay kısa örnek programlar yazacak ve bunların ışığında Amiga sistemi ile ilgili birkaç yararlı bilgi edineceğiz. Bu köşede olduğu gibi, bu örnek programları mümkün olduğunca kısa tutmaya çalışacağım, böylece hatalar en aza indirgenmiş olacak ve siz de programları sıkılmadan yazabileceksiniz. Burada anlatılanlar sadece Pascal ile ilgili konular değil, programları istediğiniz dilde yazabilirsiniz, ama bu köşe dahilinde tüm program örnekleri Pascal dilinde olacak. Belki onuncu defadır tekrarlıyorum, merak ettiğiniz soruları bana yazabilirsiniz. (Cevap bile veriyorum!!), ancak konu seçimini bana bıraktığınız sürece ben belirli bir sıra izlemeden, fazla derin olmayan konulara atlayacağım. Mümkün olduğunca konuları tek yazıda bitirmeye özen göstereceğim. Programlarda sık sık Amiga'nın Library'lerine ve bu Library'lere ait fonksiyonlara rastlayacaksınız. Bu fonksiyonları yazıda basitçe tanıtacağım, kendi programlarını geliştirmek isteyenler mutlaka Addison Wesley'in Amiga ROM Kernel Manual - Includes and Autodocs kitabını edinmeliler. Ben koşullarımı sıraladım, anlaşmaya vardıysak hemen başlayalım. Amiga kullanıcısı ile iletişime geçmek için GUI adı verilen (Graphical User Interface) ve ekranlar, pencereler, tanımlı tuşlar ve menülerden oluşan bir sistem kullanır. Amiga kullanırken sık sık bu sistemin öğeleri ile karşılaşırız. Biraz örnek vererek anlamaya gayret edelim. Ekranların belirli bir çözünürlüğü ve renk sayısı bulunur. Aynı anda farklı özelliklere sahip ekranlar olabilir. Ekran tek başına çalışmaya yetmez, o ekran içinde, içinde bulunduğunun özelliklerini taşıyan pencereler bulunur. Bu pencereler sayesinde çeşitli programlar kullanıcı ile iletişime geçebilirler. (Biliyorum, biliyorum masal kısmı gerçekten sıkıcı). Bu pencereler üzerinde bazı anlamlı düğmeler vardır. Bu düğmeler kullanılarak pencerelerin boyutları değiştirilebilir, ekrandan kaldırılabilir veya içerikleri kaydırılabilir. Amiga sisteminin bir bölümü bu işlerle ilgilenir. Bu kısım Intuition Library'sinden başkası değil. Intuition Library'sini kullanarak ekranlar, pencereler ve bunlara bağlı elemanlar üzerinde tam hakimiyet kurabilirsiniz. Bu ayki amacımız bu olaya biraz açıklık getirmek. Yukarıda kabaca belirttiğim gibi, ekranlar ve pencereler sistemin temel parçalarıdır. Ekranlar, görüntü özelliklerini tanımlarlar. Bu ekranların içinde bu özellikte iletişim elemanları, pencereler yer alır (Bir program çalışmak istiyorsa ve iş verecekse, mutlaka bir pencere açmalıdır.). Bir pencere, içinde bulunduğunun malıdır. Başka bir ekrana geçemez. Ekrana bakarak hareket eder. Bu en temel kavramların ardından ekran ve pencerelerin hafızada nasıl tanımlandığını bilmemiz gerekli. Gerek ekranlar ve gerek pencereler, hafızada özelliklerini anlatan değerlerin arka arkaya yazıldığı listeden ibarettir. Bu listelerin yapısı standarttır. Programlarken, bu tür listelere ulaşmak için Include dosyalarındaki tanımlardan faydalanırız. Hemen örnek veriyorum. Diyelim ki, hafızada herhangi bir ekranın listesinin başlangıç adresini bulduk (Her ne yoldan bulmuşsak, elimizde bir p-screen tipi de var.). Autodocs kitabından arayarak bu listedeki 16. byte'ından itibaren ilk iki byte'ın koordinatını verdiğini bulabiliriz. Ne var ki, bu bilgiyi bu şekilde kullanmayız. Bunun yerine son derece şık bir yöntem olarak Include dosyalarında yapılan tanımlardan yararlanırız. Listenin bu elemanın adı MouseX olarak tanımlanmış. scr dediğimiz p-screen tipi bir değişken olmak üzere (p-screen tipi de, Include dosyalarında tanımlanıyor). Mouse'un X koordinatını bulmak için: mx := scr^.MouseX; demek yeterli oluyor. Dikkat ederseniz, screen bir record pointer'ı olarak tanımlanmış. Gerçekten include dosyalarını karıştırarak bu tanımı bulabilirsiniz. Peki, tanım isimlerini nasıl mı bulacaksınız? Tanımlanan isimler standarttır. Autodocs kitabındaki tanımları kullanabilir veya zahmete girerek include dosyalarını karıştırabilirsiniz. Bu uygulamanın sayısız yararı var. Bir kere program anlaşılır bir hale geliyor. Ayrıca sabit değerler bakımından en önemlisi yeni Kickstart versiyonlarına kolayca uydurulabiliyor. Bakalım ekranda neler tanımlı:
FORI
(Autodocs H-56) NextScreen, FirstWindow, LeftEdge, TopEdge, Width, Height, MouseX, MouseY, Flags, Title, DefaultTitle, BarHeight, BarVborder, BarHborder, MenuVborder, MenuHborder, WBorTop, WBorLeft, WBorRight, WBorBottom, Font, ViewPort, RastPort, BitMap, Layerinfo, FirstGadget, DetailPen, BlockPen, SaveColor0, Barlayer, ExtData, UserData ekranın tüm özelliklerini belirliyor. Bakın, ilginç bir nokta göstermek istiyorum. Tüm yapılarda ortak olan bir özellik bu: Aynı özellikte başka yapılar varsa, bunların adresi belirtiliyor. Belirtilen adres NIL ise, o zaman tüm yapıları kontrol etmiş oluyorsunuz. Mesela bir ekrana ait tüm pencereleri bulmak istiyorsunuz. Dikkat edin, sadece ilk pencerenin yapısının adresi var. Ama pencere yapısında bir Next-
Window bölümü var. Bu şekilde tüm yapıları taramak mümkün. Buraya kadar şu sorunları hallettik: Eğer ekranın başlangıç adresini bulabilirsek, bu ekranın tüm özelliklerini bulmamız mümkün. Hatta bu ekrana bağlı tüm diğer elemanlara da buradan geçebiliriz. Bazı yapıların manaları üzerinde de bir iki kelime edelim (işi son derece iyi anlıyor). NextScreen, bir sonraki ekranı işaret edecektir. FirstWindow ile, ekranın ilk window'una ulaşılabilir (Buradan da tüm window'lara). LeftEdge, ekranın sol taraftan ne kadar kaydığını belirtir. Hooop hooop stop, durun bir dakika (Bunu siz söylemelisiniz). "Karar ol.", "Neden?", "Screenler istedik yükseklikten başlayabilir, ama normal olarak soldan kayamazlar da ondan!". Bu konuda haklısınız. Ancak bu kısım ileride kullanılmak için tasarlanmış, bugünlerde (en azından 1.3'te) kullanımı yok. Listelerde bu şekilde ilerisi için ayrılmış bir özellik bulunur. TopEdge ise, ekranın üst kenardan ne kadar uzak olduğunu belirtir. Width ve Height, ekranın enini ve boyunu belirtecektir. Title, ekranın ismine bir pointer'dır. Gerisinin önemi yok diye kestirip atmayacağım ama hepsini de konuyu dağıtmamak için anlatamayacağım. BlockPen ve DetailPen ise ekranın arka plan rengi ve yazı rengini belirleyecektir (Paletin hangi elemanı olduğunda). RastPort ve ViewPort ise, kendileri birer liste olan elemanlardır (Bunların da elemanları vardır). Sanırım yeteri kadar kafanızı karıştırdım.
ram konumuza:
Gelelim Birden ekranla ıştı nün. n bazen bir karmaşa ie düşüveriyorsunuz. ir program yazalım ki, tüm ekranları Workbench en arkada olacak şekilde dizelim. Dizerken tüm ekranların tepelerinin gözükmesini sam. Nasıl mı?, ilk olarak program:
Program ScreenShuffler;
(Erhan OZTOP & F.Kagan GURKAY-
NAK)
uses intuition;
const
MaxNScr - 41;
type
ScrArr — array |1..MaxNScr|) of p screen;
var
win : p window;
scr :p screen;
Pack : SerArr;
: integer;
begin
win :— Open Window
$0103,0,0, SCREEN
0,0);
Wscreen;
ifi >> MaxNScrt1 then Halt(5);
packli)| :— ser;
:— ScrA.NextScreen;
Until ser — nil;
Forj:—1toido
begin
ser :—
MoveScreen(scr,0,k-scrA.topedge);
ScreenToFront(scr);
k:— k4*ScrA.Barheight43;
if k then k :— 0;
end;
end.
Hayat ne kadar güzel değil mi? Kullanacağımızı belirtmek. Bu library, Kick Pascal'da tanımlandığından kolayca USES yardımı ile sisteme bağlanıyoruz. Bu library, gerekli tüm include dosyalarını da otomatikman bağlayacaktır. Ekranları bir dizi kullanarak sıralamak istiyoruz. Belki lazım olur diye bunu tip olarak tanımlıyoruz. ARRAY ifadesinde kullandığımız sabit ile, kaç ekran düzenleyebileceğimizi belirtiyoruz (Geleneklerimize bakarak 41 tavanını kullandık.). Daha sonra da birkaç değişken tanımlıyoruz. Hatırlayın ekranların özelliklerine erişebilmek için ilk olarak onlara ait bir pointer bulmamız şart. İlerliyoruz. Bir pencere açıyoruz. Window tanımında Workbench ekranının adresi yer alır (WSCREEN). Bu sayede bir ekrana el atmış oluruz. Gerisi son derece kolay. Yardımı ile tüm ekranları bir dolaşmak. Ekranların bittiğini NextScreen'in Nil olması ile anlayabiliyoruz. Repeat until döngüsü, bu Nil'i sezene dek devam edecektir. Döngü içinde tüm ekran başlangıç adreslerini bir dizide topluyoruz. Hani olmaz ama, 41'den fazla ekran vardır diye de kontrol ediyoruz. Evet böyle bir durum varsa, Halt(5) ile program hemen DOS'a geri dönecek ve 5 hata kodunu verecektir.
Döngünün sonunda i değişkeni toplam ekran sayısını ve PACK dizisi de bu sayıda pointer'i barındıracaktır. Yeni bir döngü ile bu ekranları sıra ile ekrana yazalım. Ekranı hareket ettirebilmek için MoveScreen Library komutunu kullanıyoruz. Bu komut, belirtilen ekranı x (sözde) ve y düzlemlerinde kaydırabiliyor. Kaydırma için ise, kayma miktarı belirtilmeli. Sorun ekran tepelerinin aynı kalınlıkta olmasının gerekmemesi. Bu yüzden k değişkeni ile o an yazılacak olan ekranın y koordinatını belirliyoruz. Bu — eski k değeri ekran tepe kalınlığı kadar pixel (Anlaşılırlık için). Ancak MoveScreen'de fark belirtmek gerekiyor. Bu ama ilk olarak ekranın o anki konumu bulunuyor ve gitmesi gereken yerle arasındaki fark alınıyor. Ekran kaydıktan sonra bu ekran ScreenToFront Intuition emri ile en öne alınıyor. Bu şekilde tüm ekranlar üst üste yazılıyorlar. k değerinin 200'ü aşması durumunda tekrar sıfırlanıyor ki, ekranlar aşağıda kaybolacaklarına öbürlerinin üzerine yansınlar. Programı geliştirmek mümkün: Mesela kolayca bir ekran açıcı yapılabilir veya ekranların özellikleri sıralanabilir. Tüm bunlar, sizin hayal gücünüze bakarak gelişecektir. Bu adımları atarak, bilgisayar programlamanın aslında o kadar öcü bir şey olmadığını, basit adımlarla son derece iyi programlar yapılabileceğini anlamanız, beni son derece sevindirecek. Herkese bol güneşli ve keyifli bir yaz tatili dileyeyim (Tatil diye tembellik etmeyin bakalım).