Amiga Dünyası sayı 20, sayfa 33

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 33

Bu bölümde geçen ay kaldığımız yerden devam edeceğim. İsterseniz hemen programımızın açıklamasına geçelim. Açıklamadan sonra bu ay assembler'da mevcut tüm komutları kısa kısa açıklayacağım. Ardından da (herhalde bu ayki yer yetmez) intuition library'si içinde dolaşmaya devam edeceğiz.

Dilerseniz programımızın diğer kısımlarını incelemeden geçelim; zira artık hep aynı temel source rutinini kullanıyoruz. Bu sefer rutinimizde geçen aya göre değişen satırlar şöyle:

*Yeni bir alt rutin eklenmiş durumda: İNİTBITMAPS.

*PUTGFX alt rutinine baktığınızda, bu rutinin değişmiş olduğunu görebilirsiniz.

*Ayrıca label listelerinin bulunduğu yerde de yeni birkaç label mevcut. Bunların isimleri şöyle: SBITMAP, DBITMAP, SRAST, DRAST.

Structure ismi : RastPort Ait olduğu library : graphics.library Kapladığı yer: 100 byte

Ofset Tip Tanımı 0 longword Layer 4 longword BitMap 8 longword AreaPtrn 12 longword TmpRas 16 longword AreaInfo 20 longword GelsInfo 24 byte Mask 25 byte FgPen 26 byte BgPen 27 byte AOlPen 28 byte DrawMode 29 byte AreaPtSize 30 byte linpatcnt 31 byte >dummy< (boş b 32 word Flags 34 word LinePtrn 36 word cp_x 38 word cp_y 40 longword minterm[0] 44 longword minterm[1] 48 word PenWidth 50 word PenHeigth 52 longword Font 56 byte AlgoStyle 57 byte TxFlags 58 word Txheight 60 word TxWidth 62 word TxBaseline 64 word TxSpacing 66 longword RP_User 70 }ilersi için 96 }rezerve edilmiştir

Daha önce de belirttiğim gibi, bu rutin yardımıyla pencere kenarını bozmadan pencere içerisine grafik koyabilmekteyiz. Bütün bu yeni eklemeleri de anlayabilmek için, dilerseniz ilk önce bitmap structure'ına göz atalım. Bitmap structure'ını Tablo I'de bulabilirsiniz. Gelelim bu structure'ın detaylı bir açıklamasına. İlk longword olan Layer, rastport'a bağlı olan layer'ı gösteren bir pointer'dır. Şu sıralar layer'larla ilgimiz olmadığı için bu bilgiyi geçiyorum. Fakat merak edenler varsa, bu layer'ların nerede kullanıldığını kısaca bir tanımlayayım. Layer'lar window'lar üst üste geldiklerinde ("overlapping") altta kalan kısımların kesilmesinden oluşan parçalara verilen addır. İki window üst üste geldiklerinde altta kalan ve gözükmeyen parça silinecektir. Window'lar tekrar ayrı ayrı gösterildiğinde ise bu silinen kısmı telafi etmek gerekecektir. Buna da sistemi yazanlar gayet basit bir çözüm bulmuşlar: Layers library. Bu library ve fonksiyonları sayesinde bu kesilen kısımlar gayet sistematik bir şekilde kontrol altında bulundurulmakta. İki window ya da screen üst üste bindiğinde sistem rutinleri silinen kısmı ilk önce bir buffer'a kopyalarlar. Daha sonra window'lar ayrı olarak yerleştirildiğinde de bu buffer'daki bilgi tekrar yerine konularak penceremizin içeriği kurtarılmış olur. Nasıl, çok basit değil mi?

Structure ismi: BitMap Ait olduğu library : graphics.library Kapladığı yer: 40 byte

Ofset Tip Tanımı 0 word BytesPerRow 2 word Rows 4 byte Flags 5 byte Depth 6 word >dummy< 8 longword Planes[1 12 longword Planes[2 16 longword Planes[3 20 longword Planes[4 24 longword Planes[5 28 longword Planes[6 32 longword Planes[7 36 longword Planes[8

Tablo I ■ RastPort ve BitMap

structure 'lan

Rastport structure'ımızdaki ikinci longword ise Bitmap. Bu da, bundan sonra hepimizin kullanacağı bir pointer ve Rastport'a ait bitmap'i gösteriyor. Bunun için de tabii ki bitmap'imizin daha önceden açılmış olması gerekmekte. Bu bitmap'i rastport'a bağladığımızda, rastport structure'ındaki bütün özellikler bitmap'lerde de var olacaklardır. Bunun için bitmap ve rastport kullanırken devamlı bunları birbirine bağlamayı unutmamalıyız. Üçüncü longword AreaPtrn adını taşımakta. Bu longword yardımıyla graphics.library'deki AreaFill fonksiyonunu kullandığımızda doldurulacak bölgeyi tanımladığımız pattern ile doldurur. Pattern'ı başka bir structure ile tanımlamamız gerekli. İleride bunun nasıl yapılacağını da göreceğiz. Bu pattern structure'ımın boyutunu da sisteme tanıtmalıyız. Bunun için de AreaPtSz byte'ını kullanmalıyız.

AMIGA ASSEMBLER

TmpRas ikincil (temporary) bir rastport'u göstermektedir. Bunu, rastport structure'ına zarar vermek istiyorsak kullanabiliriz. Fakat bunu kullanmak bir hayli karışıktır. Bu yüzden buna ilerde daha detaylı değinmeyi düşünüyorum. AreaInfo, yine AreaFill fonksiyonunda kullanılmak için bir longword'dur ve doldurulacak alan hakkında önemli bilgiler içeren structure'ı gösteren bir pointer'dır. GelsInfo longword'u da bir önceki longword gibi bir pointer ve Gels'leri tanımlamak için kullanılan structure'ı gösteriyor. Gels'ler, bildiğimiz boblardan başka bir şey değil. Ancak tümüyle library kontrolünde yapıldığı ve kullanıldığı için bunlarda hiçbir sorun çıkmaz. Mask, rastport'umuzda kullanılabilecek olan maskeleme bitplane'ini (Deluxe Paint'de stencil fonksiyonu) gösteren başka bir pointer'dır. Ne kadar çok pointer var değil mi? Programınızın her model Amiga'larda çalışmasını istiyorsanız, bütün bu kurallara dikkat etmeniz gerekiyor. Aksi takdirde gelecekte çıkabilecek tüm Amiga modellerinde de programlarınız bir guru mesajı vermekten öteye gidemezler!

FgPen ve BgPen birer byte'lık data'lardır ve rastport'taki kalem ve zemin rengini belirlemek için kullanılır. Bundan sonraki byte AOlPen ismini taşır ve areafill fonksiyonunda dış çerçevenin rengini belirleyen byte'dır. DrawMode, boyama, yazı yazma ve çizgi çizmede kullanılacak çizim modunu belirlemek için kullanılır. Amiga işletim sisteminin 4 ayrı çizim modu vardır: JAM1, JAM2, COMPLEMENT ve INVERSVID. JAM1 (=0) modunda zemin renk, çizim rengiyle AND'lenir. JAM2'de (=1) ise kullanılan işlem OR'dur. COMPLEMENT (=2) modunda XOR işlemi yapılır. INVERSVID (=4) ise yazıların negatif olarak basılmasını sağlar.

LinePtrn byte'ı o anki çizgi çizim maskesini gösterir. Bundan sonraki byte kullanılmaz. Sadece bundan sonraki dataların çift sayılı bir adrese denk gelmelerini sağlamak içindir. Bu yüzden bu byte'a dummy adını vermişler. Flags ile ne çeşit ekran kullanıldığını anlayabiliriz. Bu word'ün içeriğindeki her bir bit, başka bir anlam taşır. Bu bitlerin dökümü Tablo II'de yer almakta. Bir sonraki word'ümüz LinePtrn adını taşır ve çizgi maskesini tanımlamak için kullanılır. Bu çizim maskesi sadece bir piksel enindeki çizgiler için kullanılır. Daha yukarıdaki çizgi maskesi ise daha geniş çizgiler çizerken kullanılacak olan maskeyi tanımlamak için kullanılmakta. Ardından gelen iki word olan cp_x ve cp_y grafik kursorunun o anki ekran pozisyonunu gösterir.

Klavyeyle gezinmek için ← ve → tuşları.