Bu sayfadaki yazılar
Sayfanın metni
Sayfa 26
MaxNScr - 41;
type ScrArr — array (1..MaxNScr| of p. scre- en;
var win : p window; scr : p screen; Pack : SecrArr; i,Jak : integer;
begin win :— Open Window (20,20,200,10,-
Hayat ne kadar güzel değil mi? İlk işimiz intuition kullanacağımızı belirtmek. Bu library, Kick Pascal'da tanımlandığı için kolayca USES yardımı ile sisteme bağlayabiliyoruz. 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 bağlı kalarak 41 tavanını kullandık.). Daha sonra da birkaç değişken
$0103,0,0, SCREEN ser :— win4, Wscreen; Repeat if i >> then Halt(5); packli| :— ser; ser :— SerA.NextScreen; Until ser — nil; Forj:—1toido begin ser :— MoveScreen(scr,0,k-scrA.topedge); ScreenToFront(scr); k:— k4*ScrA Barheight-4-3; if k >200 then k :— 0;
yoruz. Hatırlayın ekranların özelliklerine erişebilmek için ilk olarak onlara ait bir pointer bulmamız şart. İlk olarak bu sorunu hallediyoruz. 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. İlk iş NextScreen'ler yardımı ile tüm ekranları bir dolaşmak. Ekranların bittiğini Next Screen'in Nil olması ile, 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. Şayet 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ğeri toplam ekran sayısını ve PACK dizisi de bu sayıda pointer'ı barındıracaktır. Şimdi 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ı değeri girilmeli. 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ığı + birkaç pixel (Anlaşılırlık için). Ancak Move Screen'de fark belirtmek gerekiyor. Bu amaçla 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 çıkarılıyor. Bu şekilde tüm ekranlar üst üste yazılıyorlar. k değerinin 200'ü aşması durumunda değer tekrar sıfırlanıyor ki, ekranlar aşağıda kaybolacaklarına öbürlerinin üzerine çıksınlar. İşte bu kadar. Tabii programı çok geliştirmek mümkün: Mesela kolayca bir ekran çalıcı yapılabilir veya ekranların özellikleri sıralanabilir. Tüm bunlar, sizin hayal gücünüze bağlı olarak 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).
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 27
C dili bütün hızıyla devam ediyor. Artık hepinizin Amiga C diline ısınmış olduğunu farz ediyorum. Bu nedenle daha profesyonel çalışmalara girebileceğimizi tahmin ederekten, bu ayki konumuzu geçen aylarda vermiş olduğum C'de Assembler dilinin kullanımının biraz daha gelişmişi olarak seçtim. Önceki sayılarda C'den Assembler alt
pea 30 pea 20 pea 10 jsr — rutine2 lea 16(sp),sp pea | pea 2 pea 3 pea 4 jsr Trutine3 lea 16(sp),sp
:) 4 (sp)4,.3 unik a Tİs egu 0 3 reg public — rutine3 public — rutine2 public — rutinel public dseg end
Assembler listesi yukarıdaki C programına ait. Şimdi dikkat edilecek nokta, alt rutinlerin nasıl kullanıldığı ve parametrelerin yollanması. C programından takip ederseniz, birinci rutinde 1, 2, 3 ve 4 sayıları parametre olarak yollanıyor. Assembler alt rutinlerinin nasıl kullanıldığını ve hazırlandığını öğrenmiştik. Bu ay, C'den Assembler alt rutinlerine nasıl parametre yollandığını daha derinlemesine inceleyeceğiz. Bunu yapmak için ilk olarak isterseniz bir C ve C'den çevrilme Assembler rutinini inceleyelim;
main()
rutine2(10,20,30,40); rutine3(4,3,2,1);
Üç adet rutinin çağrıldığı basit bir C programı görüyorsunuz. Rutinler içerisinde dikkat ettiyseniz parametreleri de mevcut. Rutinlerin işlevlerini göz önüne almıyoruz. Şimdi bir de bu programın assembler'a çevrilmiş halini inceleyelim; :A5=8
;main() public — main —Main: link a5,#.2
movem. .3,-(sp) ş;Tutine1(1,2,3,4); pea 4 pea 3 pea 2 pea 1 jSr — Tutinel lea 16(sp),sp ürer 10,20,30,40); a 40
Assembler listesinde ise bu parametrelerin SP (Stack Pointer) göstergecine aktarılarak yollandığını görüyoruz. Buradan da anlaşılıyor ki, parametreler SP'ye yerleştiriliyor. Bu durumda bizim yapmamız gereken, rutin içerisinde iken parametreleri SP'den geri almak. Aşağıdaki örnek programı dikkatle izleyin;
int a; main()
90d",a); )
#asm - topla: move.l 4(sp),d0 add.l 8(sp),d0 add.l 12(sp),d0 add.l 16(sp),d0 Tits
public #endasm
Program içerisinde bir toplama rutini hazırladım. Bu rutin verilen dört adet sayıyı toplayarak geri dönüyor. İlk olarak topla() rutinini çağırıyoruz: a=topla(0,5,10,20);
Yollanan parametreler 0, 5, 10 ve 20 sayıları olsun. Bu parametreler ilk örnekteki gibi SP'ye aktarılacaktır. Daha sonra program Assembler alt rutinine sıçrayarak parametreleri SP'den alacaktır. Bu iş için SP'nin gösterdiği adresin 4 ilerisinden ilk parametreyi alıyoruz. Çünkü SP'ye son yollanan değerden sonra, SP, 4 byte azaltılır. SP, yollanan her değerden sonra 4 azaltıldığından, diğer parametreleri de 4'er aralıkla SP'den çekiyoruz:
move.l — 4(sp),d0 — ; 1.parametre add.| 8(sp),d0 — ; 2.parametre add.l 12(sp),d0 ; 3.parametre add.l 16(sp),d0 ; 4.parametre
Değerler toplanarak D0 register'ına yükleniyor. RTS Assembler komutu ile de, C'ye geri dönüyoruz. Toplam değer D0 üzerinde olduğundan sonuç 'a' değişkenine aktarılıyor ve 'printf()' ile değerin doğruluğunu kontrol ediyoruz. Evet parametre yollamanın püf noktalarını öğrendiğinize göre artık daha kapsamlı bir örneğe geçebiliriz. Aşağıda vermiş olduğum program, Assembler yardımıyla library'yi ve ekran açmamızı sağlıyor. Fakat bu ekranın bazı özellikleri mevcut. İlk olarak "show bitmap();" rutini ile istediğiniz hafıza bölgesini C'den kontrol ederek gösterebiliyorsunuz. İsterseniz programımıza bir göz atalım;
/* Programming by C. OZKURT */ /* (c) 1992 Amiga Dünyası */ #include <exec/memory.h> #include <graphics/gfxbase.h> #include <intuition/intuitionbase.h>
struct GfxBase *GfxBase; struct RastPort rp; struct BitMap bm; mainO
start(); /* library ve ekranı aç */ set color(1,0xfff); /* birinci rengin pa- letini Oxfff yap */ Move(&rp,0,0); Draw(&rp,320,256); ları ile çizgi çiz */ left mouse(); /* sol mouse kontrolu */ /* library ve ekranı kapa */ )
alloc start()
/* sistem komut-
InitBitMap(&bm,3,320,256); 10240,MEMF CLEAR); bm.Planes| 10240,MEMF -CHIPİMEME CLEAR); bm.Planes|2)J-AllocMem( 10240,MEMF CLEAR); InitRastPort(&rp); rp.BitMap-&bm; |
alloc stop() FreeMem(bm.Planes(0)1,10240);
FreeMem(bm.Planes|11,10240); FreeMem(bm.Planes|21,10240);