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ı.
Sayfa 32
ADI ADR R/W İŞLEVİ AUD3PER 0D6 W KANAL 3 PERİYOD SÜRESİ AUD3VOL 0D8 W KANAL 3 VOLÜM AUD3DAT 0DA W KANAL 3 SES DATASI (D/A ÇEVİRİCİYE GİDER) ----- 0DC - KULLANILMIYOR ----- 0DE - KULLANILMIYOR BPL1PTH 0E0 W BITPLANE 1 ADRESİ. BİT (16-18) BPL1PTL 0E2 W BITPLANE 1 ADRESİ. BİT (1-15) BPL2PTH 0E4 W BITPLANE 2 ADRESİ. BİT (16-18) BPL2PTL 0E6 W BITPLANE 2 ADRESİ. BİT (1-15) BPL3PTH 0E8 W BITPLANE 3 ADRESİ. BİT (16-18) BPL3PTL 0EA W BITPLANE 3 ADRESİ. BİT (1-15) BPL4PTH 0EC W BITPLANE 4 ADRESİ. BİT (16-18) BPL4PTL 0EE W BITPLANE 4 ADRESİ. BİT (1-15) BPL5PTH 0F0 W BITPLANE 5 ADRESİ. BİT (16-18) BPL5PTL 0F2 W BITPLANE 5 ADRESİ. BİT (1-15) BPL6PTH 0F4 W BITPLANE 6 ADRESİ. BİT (16-18) BPL6PTL 0F6 W BITPLANE 6 ADRESİ. BİT (1-15) ----- 0F8 - KULLANILMIYOR 0FA - KULLANILMIYOR ----- 0FC - KULLANILMIYOR ...... 0FE - KULLANILMIYOR BPLCON0 100 W BITPLANE KONTROL REGISTER'I 0 BPLCON1 102 W BITPLANE KONTROL REGISTER'I 1 (SCROLL DEĞERİ) BPLCON2 104 W BITPLANE KONTROL REGISTER'I 2 (PRİORITY CONT) ...... 106 - KULLANILMIYOR BPL1MOD 108 W TEK PLANE'LER İÇİN BİTPLANE MODULE'Ü BPL2MOD 10A W ÇİFT PLANE'LER İÇİN BITPLANE MODULE'Ü ...... 10C - KULLANILMIYOR 10E - KULLANILMIYOR BPL1DAT 110 W BITPLANE 1 DATA (RGB ÇIKIŞA) BPL2DAT 112 W BİTPLANE 2 DATA (RGB ÇIKIŞA) BPL3DAT 114 W BİTPLANE 3 DATA (RGB ÇIKIŞA) BPL4DAT 116 W BİTPLANE 4 DATA (RGB ÇIKIŞA) BPL5DAT 118 W BİTPLANE 5 DATA (RGB ÇIKIŞA) BPL6DAT 11A W BİTPLANE 6 DATA (RGB ÇIKIŞA) 11C - KULLANILMIYOR ----- 11E - KULLANILMIYOR SPR0PTH 120 W SPRITE DATA 0, BİT (16-18) SPR0PTL 122 W SPRİTE DATA 0, BİT (1-15) SPR1PTH 124 W SPRİTE DATA 1, BİT (16-18) SPR1PTL 126 W SPRİTE DATA 1, BİT (1-15) SPR2PTH 128 W SPRİTE DATA 2, BİT (16-18) SPR2PTL 12A W SPRİTE DATA 2, BİT (1-15) SPR3PTH 12C W SPRİTE DATA 3, BİT (16-18) SPR3PTL 12E W SPRİTE DATA 3, BİT (1-15) SPR4PTH 130 W SPRİTE DATA 4, BİT (16-18) SPR4PTL 132 W SPRİTE DATA 4, BİT (1-15) SPR5PTH 134 W SPRİTE DATA 5, BİT (16-18) SPR5PTL 136 W SPRİTE DATA 5, BİT (1-15) SPR6PTH 138 W SPRİTE DATA 6, BİT (16-18) SPR6PTL 13A W SPRİTE DATA 6, BİT (1-15) SPR7PTH 13C W SPRİTE DATA 7, BİT (16-18) SPR7PTL 13E W SPRİTE DATA 7, BİT (1-15) SPR0POS 140 W SPRİTE 0 START POZİSYONU (VERT VE HORIZ) SPR0CTL 142 W SPRİTE 0 KONTROL REG. VE VERTİKAL STOP SPR0DATA 144 W SPRİTE 0 DATA REGISTER A (RGB ÇIKIŞA) SPR0DATB 146 W SPRİTE 0 DATA REGISTER B (RGB ÇIKIŞA) SPR1POS 148 W SPRİTE 1 START POZİSYONU (VERT VE HORIZ) SPR1CTL 14A W SPRİTE 1 KONTROL REG. VE VERTİKAL STOP SPR1DATA 14C W SPRİTE 1 DATA REGISTER A (RGB ÇIKIŞA) SPR1DATB 14E W SPRİTE 1 DATA REGISTER B (RGB ÇIKIŞA) SPR2POS 150 W SPRİTE 2 START POZİSYONU (VERT VE HORIZ) SPR2CTL 152 W SPRİTE 2 KONTROL REG. VE VERTİKAL STOP SPR2DATA 154 W SPRİTE 2 DATA REGISTER A (RGB ÇIKIŞA) SPR2DATB 156 W SPRİTE 2 DATA REGISTER B (RGB ÇIKIŞA) SPR3POS 158 W SPRİTE 3 START POZİSYONU (VERT VE HORIZ) SPR3CTL 15A W SPRİTE 3 KONTROL REG. VE VERTİKAL STOP SPR3DATA 15C W SPRİTE 3 DATA REGISTER A (RGB ÇIKIŞA) SPR3DATB 15E W SPRİTE 3 DATA REGISTER B (RGB ÇIKIŞA) SPR4POS 160 W SPRİTE 4 START POZİSYONU (VERT VE HORIZ) SPR4CTL 162 W SPRİTE 4 KONTROL REG. VE VERTİKAL STOP SPR4DATA 164 W SPRİTE 4 DATA REGISTER A (RGB ÇIKIŞA) SPR4DATB 166 W SPRİTE 4 DATA REGISTER B (RGB ÇIKIŞA) SPR5POS 168 W SPRİTE 5 START POZİSYONU (VERT VE HORIZ) SPR5CTL 16A W SPRİTE 5 KONTROL REG. VE VERTİKAL STOP SPR5DATA 16C W SPRİTE 5 DATA REGISTER A (RGB ÇIKIŞA) SPR5DATB 16E W SPRİTE 5 DATA REGISTER B (RGB ÇIKIŞA) SPR6POS 170 W SPRİTE 6 START POZİSYONU (VERT VE HORIZ) SPR6CTL 172 W SPRİTE 6 KONTROL REG. VE VERTİKAL STOP SPR6DATA 174 W SPRİTE 6 DATA REGISTER A (RGB ÇIKIŞA) SPR6DATB 176 W SPRİTE 6 DATA REGISTER B (RGB ÇIKIŞA) SPR7POS 178 W SPRİTE 7 START POZİSYONU (VERT VE HORIZ) SPR7CTL 17A W SPRİTE 7 KONTROL REG. VE VERTİKAL STOP SPR7DATA 17C W SPRİTE 7 DATA REGISTER A (RGB ÇIKIŞA) SPR7DATB 17E W SPRİTE 7 DATA REGISTER B (RGB ÇIKIŞA) COLOR00 180 W RENK PALETİ REGISTER'I 0 COLOR01 182 W RENK PALETİ REGISTER'I 1
Artık Chip Register'larını programlamaya geçebiliriz. Chip register'ları direk olarak adreslenebilirler. Örneğin: Arkaplan renk register'ının değerini değiştirelim. Eğer tabloya bakacak olursak bu register'ın relatif adresinin $180 olduğunu görürüz. Gerçek adresin $dff180 olduğunu hesaplayıp MOVE.W komutuyla buraya istediğimiz değeri verebiliriz.
MOVE.W #DEĞER,$DFF180 ; değer COLOROO'a
Eğer bir register'dan daha fazlasına ulaşılacaksa, baz adresi bir adres register'ında depolamak ve bir ofsetle indirect adresleme yapmak iyi bir fikirdir. Bir örnek verelim:
LEA $DFF000,A5 ;baz adresi A5'e yerleştir MOVE.W #DEĞER 1 ,$ 180(A5);COLOR00=değerl MOVE.W #DEĞER2,$ 182(A5);COLOR01 =değer2 MOVE.W.... VS.
Normalde Chip register'lara görüldüğü gibi word seviyesinde ulaşılır. Ancak register'lara LONGWORD seviyesinde de ulaşılabilir. Bu sayede iki register bir defada yazılmış olur. Örneğin:
MOVE.L #$40000,$0E0(A5);BPL1PTH ve BPL1PTL
;register'larına gerçek ;değerleri girer. Chip register'larına ulaşım yukarıdaki örneklerde olduğu gibidir.
Bu aylık yazımızı burada noktalıyor ve hepinize en içten sevgilerimizi yolluyoruz.
ADI ADR R W İŞLEVİ COLOR02 184 W RENK PALETİ REGISTER'İ 2 COLOR03 186 W RENK PALETİ REGISTER'İ 3 COLOR04 188 W RENK PALETİ REGISTER'U COLOR05 18A W RENK PALETİ REGISTER'İ 5 COLOR06 18C W RENK PALETİ REGISTER'İ 6 COLOR07 18E W RENK PALETİ REGISTER'İ 7 COLOR08 190 W RENK PALETİ REGISTER'İ 8 COLOR09 192 W RENK PALETİ REGISTER'İ 9 COLOR10 194 W RENK PALETİ REGISTER'İ 10 COLOR11 196 W RENK PALETİ REGISTER'İ 11 COLOR12 198 W RENK PALETİ REGISTER'İ 12 COLOR13 19A W RENK PALETİ REGISTER'İ 13 COLOR14 19C W RENK PALETİ REGISTER'İ 14 COLOR15 19E W RENK PALETİ REGISTER'İ 15 COLOR16 1A0 W RENK PALETİ REGISTER'İ 16 COLOR17 1A2 W RENK PALETİ REGISTER'İ 17 COLOR18 1A4 W RENK PALETİ REGISTER'İ 18 COLOR19 1A6 W RENK PALETİ REGISTER'İ 19 COLOR20 1A8 W RENK PALETİ REGISTER'İ 20 COLOR21 1AA W RENK PALETİ REGISTER'İ 21 COLOR22 1AC W RENK PALETİ REGISTER'İ 22 COLOR23 1AE W RENK PALETİ REGISTER'İ 23 COLOR24 1B0 W RENK PALETİ REGISTER'İ 24 COLOR25 1B2 W RENK PALETİ REGISTER'İ 25 COLOR26 1B4 W RENK PALETİ REGISTER'İ 26 COLOR27 1B6 W RENK PALETİ REGISTER'İ 27 COLOR28 1B8 W RENK PALETİ REGISTER'İ 28 COLOR29 1BA W RENK PALETİ REGISTER'İ 29 COLOR30 1BC W RENK PALETİ REGISTER'İ 30 COLOR31 1BE W RENK PALETİ REGISTER'İ 31 1C0 dan IFE'ye kadar olan registerlar kullanılmazlar