Amiga Dünyası sayı 18, sayfa 45

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 45

Merhaba arkadaşlar! Bu ay Assembler köşesinde, geçen ay da belirttiğim gibi bir window içerisine grafik basmayı göreceğiz. Bunun için de geçen ay yayınladığım programı kullanabilirsiniz. Programda sadece bazı satırları silip yerine yenilerini ekleyeceğiz. Söz verdiğim gibi bu ay MasterSeka v1.75'i komple açıkladım. Seka konusunda hiçbir sorununuz kalmayacağını umuyorum. Geçelim bu ayki konumuza. İlk önce isterseniz program listemizi bir yazalım. Bunun için verdiğim programı baştan yazabilir ya da geçen ayki listenin gerekli yerlerini değiştirebilirsiniz. Değişikliklerin yanısıra bazı satırların da silinmesi gerekmekte. Bu satırlar şunlar: * 12. satır: bsr.L DRAWBOXES * 86.-114. arası: DRAWBOXES alt-rutini * 158.-185. arası: COORDSPTR ve COORDS dataları

Bunun dışında, window içinde gösterilecek bir de resim hazırlamanız gerekmekte. Deluxe Paint'in MED-RES modunda dilediğiniz şekilde bir resim hazırlayabilirsiniz. Yalnız resmin 2 renkli (=1 bitplane) olmasına dikkat edin. Kendi hazırladığınız resmin programımız tarafından tanınmasını sağlamak istiyorsanız, kaydedilen IFF resmi RAW formatına çevirmeniz gerekmekte. Bunu da herhangi bir IFF-CONVERTER programıyla yapabilirsiniz. Formatı değiştirilen resmi kaydederken <RESIM.bm> ismini kullanırsanız, son satırdaki 'incbin' komutu compile işlemi sırasında resmi otomatik olarak label'dan sonrasına yükleyecektir.

Programımızda değişik olarak gözümüze çarpan tek alt-rutin, PUTGFX'dir. Şimdi bu alt-rutini birlikte inceleyelim.

PUTGFX: move.l RASTPORT,a0 move.l 4(a0),a1 move.l 8(a1),a2 add.l #[80*20],a2 move.l #PIC,a1 move.l #[80*256]-1,d7 PLOOP: move.l (a1)+,(a2)+ dbf d7,PLOOP rts İlk satırdaki move komutu yardımıyla, window'a ait rastport structure'ının adresi, a0 registerine aktarılmakta. Bildiğiniz gibi rastport structure'ı, ekran ya da window ile önemli bilgiler ihtiva eder. Bu bilgilerden biri de bitmap structure'ının hafızadaki yeridir. İkinci satır yardımıyla bu

Cem GENCER adresi okuyarak a1 registerine yazıyoruz. Bu satırdan da görebileceğiniz gibi, bitmap structure'ının adresi rastport structure'ının 2. longword'ünde bulunmakta. Bitmap structure'ının içinde de ekranda görünen grafiksel bilgi hakkında önemli datalar bulunmakta. Bu datalardan biri de bitplane'lerin hafızadaki yerleridir. İlk bitplane adresimiz, bitmap structure'ının 3. longword'ünde bulunmakta. move.l 8(a1),a2 satırıyla, bu adresi a2 registerine yazıyoruz. Bir sonraki satır, bu adrese [80*20] değerini eklemekte. Bu sayede resmimizin 20 satır aşağıda görünmesini sağlamaktayız. Peki bu sayıyı niye 80 ile çarpıyoruz, bilen var mı? Bir MED-RES ekran satırı, 80 byte (640 piksel/8 bit)'tan oluşmakta. Aynı şekilde bir LO-RES resim basmaya kalksaydık, buraya 80 yerine 40 değeri yazmamız gerekecekti.

LO-RES bir ekranda çarpan olarak 80 değerini girersek; 80, 40'ın tam iki katı olduğuna göre, resmimiz dikeyde 20. satırdan itibaren görünmesi gerekirken, iki katı olan 40. satırdan sonra gözükür.

move.l #PICTURE,a1 satırı, PICTURE label'ının adresini a1 register'ına atar.

move.l #[80*256]-1,d7 PLOOP: move.l (a1)+,(a2)+ dbf d7,PLOOP Bundan sonrası daha basit bir kopyalama döngüsü. Her seferinde a1 register'ının gösterdiği adresin içeriği, longword olarak a2 register'ının gösterdiği adres içeriğine kopyalanır ve her iki adres register'ı da 4 artırılarak bir sonraki dataya erişim sağlanır. Bu, resim dataları bitene kadar tekrarlanır.

Bu rutin, tek bitplane'lik bir resmi basmamızı sağlamakta. Peki, daha fazla renk kullanmak için neler yapmamız gerekmekte? Gayet basit, window'a ait bitplane adedini artırmalıyız. Window'a ait bitplane adedi, screen'e ait bitplane adedi artarsa artacaktır. Nedeni de bir screen'e ait tüm window'ların aynı bitplane sayısına sahip olmalarıdır. Window structure'ındaki 8. word'ü değiştirerek bitplane adedinin artmasını sağlayabiliriz. Bu word, screen'e ait bitplane adedini belirlemek için kullanılmakta.

Peki bu durumda diğer bitplane'lerin adresini nasıl bulacağız? Aynı tek bitplane'deki gibi. Nasıl bitmap structure'ının 3. longword'ü ilk bitplane'in adresini gös-

AMIGA ASSEMBLER

teriyorsa, sırayla 4., 5., 6., 7. ve 8. longword'lar da diğer bitplane'lerin adresini göstermektedir. Dilerseniz bu bitmap structure'ını kısaca bir tanıtalım. Gösterdiğim structure, sadece örnektir. Bu yüzden de tüm dataların yerine bu dataları tanımlayan orijinal isimleri aynen kullandım. Bu isimleri ROM Kernel Reference Manual'larda (özellikle 'Libraries and Devices', 'Intuition', 'Exec' ve 'Includes and Autodocs') bulabilirsiniz. Bundan sonra da structure açıklarken orijinal isimler kullanacağım. İleride structure'lar artınca, size bunları bir tablo halinde kısa açıklamalarıyla vereceğim. Sizin de bu isimlere alışmanızda fayda var; zira bunlarla çalışmak bir hayli kolay olacak.

BİTMAP: dc.w bm_BytesPerRow dc.w bm_Rows dc.b bm_Flags dc.b bm_Depth dc.w bm_Pad dc.l bm_Plane1 dc.l bm_Plane2 dc.l bm_Plane3 dc.l bm_Plane4 dc.l bm_Plane5 dc.l bm_Plane6 Bu structure'daki ilk word, bir ekran satırında kaç byte bulunduğunu (byte adedi = piksel sayısı/8) belirtir. bm_Rows ise, ekrandaki toplam satır sayısını belirler. bm_Depth ile, ekranda kullanılan bitplane sayısı tanımlanır. bm_Plane1-bm_Plane6 dataları ise, herbir bitplane'in hafızadaki adreslerini gösterir. Biz tüm bitplane adreslerini bm_Planex datalarından okuyabiliriz:

1. için move.l 8(a1),a0 2. için move.l 12(a1),a0 3. için move.l 16(a1),a0 4. için move.l 20(a1),a0 5. için move.l 24(a1),a0 6. için move.l 28(a1),a0 Resmimizin her bir bitplane'inin adreslerini bulmak istiyorsak, resmin en ve boyunu piksel olarak bilmemiz gerekmekte. Aşağıdaki formülle her bir bitplane'in byte olarak uzunluğunu elde edebiliriz, uzunluk = (genişlik / 8) * yükseklik Buna göre, her bir bitplane'in adresini şu şekilde bulabiliriz : 1.bitplane= resmin başı 2.bitplane= resmin başı + (bir bitplane boyutu (byte)* 1) 3.bitplane= resmin başı + (bir bitplane boyutu (byte)*2) 4.bitplane= resmin başı + (bir bitplane boyutu (byte)*3) 5.bitplane= resmin başı + (bir bitplane boyutu (byte)*4) 6.bitplane= resmin başı + (bir bitplane boyutu (byte)*5) Artık bundan sonra tek eksiğimiz renk ayarlamasında. Bunu da copper listesi adını verdiğimiz data tablosu yardımıyla sağlayabiliriz. Copper listesi hakkında daha geniş bilgiyi 'Assembler'in Ufukları' yazısında bulabilirsiniz.

Bu resim basma yönteminin bazı sakıncaları var. Bunlardan ilkini, programı ça-

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