Bu sayfadaki yazılar
Sayfanın metni
Sayfa 44
Curs Off: Cls : Paper 0 : Locate 0,0 Centre "Hardwvare sprites Demo "
Do IX#=X Mouse IY#=Y Mouse X#=A#*X1#+B#*IX#+C#*IX1# Y#=A#*Y1#+B#*IY#+C#*IY1# Sprite 1X#+5O.Y#+5O,1 IX1#=IX# IY1#=IY# X1#=IX# Y1#=IY# Wait2 If Mouse Key>0 Then Exit Loop Yukarıdaki programın ilk üç satırını şu şekilde değiştirirseniz, sonuç daha ilginç olur:
A#=0.9499994 B#=-0.6 C#=0.6299989 Gelecek ay, bunun gibi matematiksel hilelerden daha çok bahsedeceğim. Ayrıca bir de sürprizim olacak....
Şimdi komut açıklamalarına devam edelim: KOMUT: Get Sprite palette KULLANILIŞ: Get Sprite palette [m] Bu komut ile Sprite'lar için kullanılan renkler, o anki ekran için de kullanılır, 'm' parametresi ile bu renklerin sadece bir kısmının alınması sağlanır. Örneğin m=%0000000000111111 ile ilk 6 renk bu paletten alınır. Bu arada sprite'ların renkleri renk tablosunun 16 ile 32. kütükleri arasından alınır. Her Sprite'a karşılık düşen renk numaraları şöyledir:
Sprite Renk numarası 0/1 17/18/19 2/3 21/22/23 4/5 25/26/27 6/7 29/30/31 16, 20, 24 ve 28 numaralı renkler saydam kabul edilir. KOMUT: Get Sprite KULLANILIŞ: Get Sprite [e,]x1,y1 to x2,y2 Bu komut ile ekranın herhangi bir bölgesindeki şekli Sprite bankasına alabilirsiniz. Burada 'x1', 'y1', 'x2' ve 'y2' parametreleri, ekran koordinatlarını; 'e' ise ekran numarasını belirler. Eğer
'e' belirtilmemişse, o zaman o an aktif olan ekran kullanılır, 'g'
yine resim numarasıdır. Aşağıdaki örnekte bu komutların ikisi de kullanılmış. Rem ******************************** Rem** AMIGA DÜNYASI ** Rem ** AMOS Demo Program ** Rem ** Modified from ** Rem** the AMOS Manual ** Rem ** By Rem ** Burak Özdemir ** Rem ** AMOS Copyright 1990 Rem ** Mandarin/Jawx ** Rem ******************************** MAKE_OBJECT Flash Off: Get Sprite Palette Curs Off: Cls 0 : Paper 0 Locate 0,0 : Centre "Hardware sprite Demo " Hide Do Wait Vbl X=X Mouse : Y=Y Mouse For SX=0 To 3 Sprite SX+9,SX*32+X,Y,1 Next SX If Mouse Key>0 Then Exit Loop Procedure MAKE_OBJECT Cls 0
Polygon 8,0 To 16,16 To 0,16 To 8.0 Polygon0,16To0,0To4,4To 12.4 To 16.0 To 16.16 To 0.16 Get Sprite 1,0,0 To 16,16 End Proc KOMUT: x Sprite KULLANILIŞ: x Sprite(n) Bu komutla, numarası verilen Sprite'm x eksenine göre hard- ware koordinatını bulabilirsiniz. KOMUT: y Sprite KULLANILIŞ: y Sprite(n) Bu komut da deminki gibidir, ama y koordinatı için geçerlidir. Rem ******************************** Rem ** AMIGA DÜNYASI ** Rem ** AMOS Demo Program ** Rem ** Modified from ** Rem ** the AMOS Manual ** Rem ** B_y ** Rem ** Burak Özdemir ** Rem ** AMOS Copyright 1990 ** Rem ** Mandarin/Jawx ** Rem ******************************** Load"AMOS_DATA:Sprites/Octopus.abk" Get Sprite Palette Curs Off : Cls 0 : Paper 0 Hide Locate 0,0 : Print "X kordinati = "; Locate 0,1 : Print "Y kordinati = "; Do Sprite 9,X Mouse,Y Mouse, 1 Locate 20,0 : Print X Sprite(9);" "; Locate 20,1 : Print Y Sprite(9);" "; Wait Vbl If Mouse Key>0 Then Exit Loop Son olarak da, bir AMAL programı veriyorum. Bu konudan daha pek bahsetmedik, ama yine de kolay anlaşılır bir örnek. Rem ********************************
Rem** AMIGA DÜNYASI ** Rem ** AMOS Demo Program ** Rem ** Modified from ** Rem ** the AMOS Manual ** Rem ** By ** Rem ** Burak Özdemir ** Rem** AMOS Copyright 1990 ** Rem ** Mandarin/Jawx ** Rem ******************************** Flash Off : Hide : Curs Off Screen Hide 0 : View MAKE_OBJECT Hide Cls 0 Locate 0,0 : Paper 0 Centre "Patlamayi hareket ettirin" Sprite 9,X Mouse,Y Mouse, 1 Amal 9,"Loop:For R0=l To 16:Let A=R0;Next R0;Jump Loop" Amal On Screen Show Do Sprite 9,X Mouse,Y Mouse, 1 : Wait Vbl If Mouse Key>0 Then Exit Loop Procedure MAKE_OBJECT ForS=l To 15 Cls 0,0,0 To 32,32 Circle 16,16,S*2 Get Sprite S,0,0To 32,32 Next S End Proc
Bu aylık bu kadar. Tekrar görüşmek üzere...
Klavyeyle gezinmek için ← ve → tuşları.
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-