Amiga Dünyası sayı 20, sayfa 35

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 35

da INCBIN kullanarak hem hafıza ayırıyoruz, hem de disketten bir data dosyası (binary) okuyoruz. Bundan sonra gelen satırlar hemen hemen deminkilerin aynısı. Değişen tek şey sadece son beş satır:

lea DBITMAP,a3 move.l RASTPORT.aO move.l 4(a0),al move.l 8(al),8(a3) rts Burada daha önce OpenWindow fonksiyonundan elde ettiğimiz window'a ait RastPort structure'ının adresini AO'a, bizim açmış olduğumuz DBITMAP structure'ının adresini ise A3'e atıyoruz. Ardından da window'a ait RastPort'un 4. byte'ından sonra gelen longword'u Al'e kopyalıyoruz. Bu, window'umuza ait olan Bit- Map structure'ının adresidir. Son satırla da bu BitMap structure- 'ındaki ilk bitplane adresini alıp bizim RastPort structure'ına ilk bitplane adresi olarak yazıyoruz. Bu şekilde DBITMAP'in bitp- lane'iyle window'un bitplane'i aynı yerde olmakta.

Gelelim bir sonraki alt rutinimiz olan PUTGFX'e. Burada açmış olduğumuz bitmap'lerden birindeki resim datasını diğerine (ekrana) kopyalamamız gerekmekte. Daha önce anlattığım yöntem sistem kurallarını hiçe sayarak çalıştığından, window'un kenarlarını tahrip etmekteydi. Burada ise graphics.library'den bir fonksiyon kullanacağız. Bu fonksiyonun adı BltBitMap ve amacı bir bitmap'e ait bitplane'lerden dörtgen bir alanı başka bir bitmap structure'ına ait bitplane'lere kopyalamak. Fonksiyonu çağırmadan önce yine doğru library base adresini A6'ya atıyoruz. Bundan sonraki satırlarda fonksiyonun ihtiyacı olan bazı parametreleri çeşitli register'lara yazıyoruz. Bu parametreler ve ait oldukları register'lar şöyle:

A0-srcBitMap: Source (kaynak) BitMap structure'ının adresi. A1-destBitMap: Destination (sonuç) BitMap structure'ının adresi.

A2-tempA: Source ile destination aynı bitplane'deyse ve bu kopyalanacak dörtgenle sonuç dörtgenin koordinatları çakışıyor-

Fonksiyon ismi: OldOpenLibrary Bulunduğu library: 'exec.library' Ofseti: -408 (=-$198) Parametreler: * giriş bilgileri: LibName->a1 * çıkış bilgileri: d0->LibBase ya da 0

Fonksiyon ismi: Text

Bulunduğu library: 'graphics.library' Ofseti: -60 (=-$3c) Parametreler: * giriş bilgileri: String -> a0; RastPort -> a1; Count -> d0 * çıkış bilgileri: yok

Fonksiyon ismi: InitBitMap Bulunduğu library: 'graphics.library' Ofseti: -390 (=-$186) Parametreler: * giriş bilgileri: BitMap-> a0; Depth -> d0; Width -> d1; Height -> d2 * çıkış bilgileri: yok

Fonksiyon ismi: InitRastPort Bulunduğu library: 'graphics.library' Ofseti: -198 (=-$c6) Parametreler: * giriş bilgileri: RastPort -> a1 * çıkış bilgileri: yok

Fonksiyon ismi: BltBitMap Bulunduğu library: graphics.library' Ofseti:-30 (=-$1 e) Parametreler: * giriş bilgileri: SrcBitMap - > aO; DestBitMap -> a1; TempA -> a2 SrcX -> dO; SrcY -> d1; DestX -> d2; DestY -> d3 SizeX -> d4; SizeY -> d5: Mınterm -> d6; Mask -> d7 * çıkış bilgileri: yok Tablo 5 - Library Fonksiyonları sa bu register hafızada boş bir alanı göstermelidir. Bu alanın boyutu kopyalanacak alan * bitplane sayısı kadar olmalıdır. Daha ilerde bu opsiyonu daha detaylı göreceğiz.

D0-srcX: Source bitplane'lerinden kopyalanacak alanın sol üst köşesine ait x koordinatı.

D1-srcY: Kopyalanacak alanın sol üst köşesinin y koordinatı. D2-destX: Kopyalanacak dörtgenin destination bitplane'leri üzerinde basılacağı x koordinatı.

D3-destY: Dörtgenin destination bitplane'lerinde basılacağı y koordinatı.

D4-sizeX: Kopyalanacak dörtgenin genişliği (piksel olarak). D5-sizeY: Dörtgenin yüksekliği. D6-minterm: Kopyalama şekli:

$c0= direkt kopyalama $30= kopyalama sırasında resim dataları negatiflenir. $50= sadece destination ekranındaki resim bilgilerini negatifler. D7- Kopyalamada kopyalanacak bitplane'lere ait flag'ler. Herbir bit bir bitplane'i temsil eder. Bu şekilde dilerseniz resimdeki bazı bitplane'leri kopyalamayabilirsiniz. Normal bir kopyalama için buraya 255 değeri (=$ff) yazmanız gerekmekte.

Bu fonksiyonun da açıklamasını Tablo V'de düzenli olarak görebilirsiniz.

Ehh, geçen ayki programın açıklamasını sonunda bitirebildim. Ne dersiniz, bu program sayesinde yeni birçok şey öğrendiniz değil mi? Bu aylık bu kadar bilgi yeter herhalde. Artık köşemin geri kalan kısmında da assembler komutlarının tablosunun ilk kısmını (Tablo VI) koyuyorum. Önümüzdeki iki ay boyunca bu tabloyu tamamlayacağım. Buradaki komutlar ile ilgili örnekleri ilerledikçe programlarımız içinde göreceksiniz. Tablonun ilk kolonunda adresleme şeklini <ea> ile belirleriz. Adresleme kolonundaki altkolonlarda da o komutun gösterilen adresleme tipiyle çalışıp çalışmadığını; Flag'ler kolonunda komut kullanıldığında etkilenen flag'leri görebilirsiniz. Buradaki <-> işareti uygun flag'ın etkilenmediğini, <0> ise 0 konumuna geldiğini belirler. <*> sembolü flag'in değiştiğini, <1> flag'ın 1 olduğunu, <U> ise belirsiz konum olduğunu gösterir.

İlk kolonda 2-3 komutun içindeki bazı harflerin cc olduğunu göreceksiniz. Bu cc harfleri yerine Tablo VII'deki branch komut eklerinden birini koyabilirsiniz.

xx: Anlamı: İşlevi:

T true-doğru sonuç 1'mi? F false-yanlış sonuç 0'mı? HI high-yüksek sonuç > verilen değer? LS low/same-alçak/aynı sonuç <= verilen değer? CC Carry clear-Carry sönük Carry flag'ı 0 mı? CS Carry set-Carry yanık Carry flag'ı 1 mi NE not equal-eşit değil EQ equal-eşit

Sonuç, değere eşit değil mi? Sonuç, değere eşit mi? VC Overflow clear-Ovf, sönük Sonuçta taşma yok mu? VS Overflow set-Ovf, yanık Sonuçta taşma var mı? PL Plus-pozitif Sonucun durumu pozitif mi? MI Minus-negatif Sonucun durumu negatif mi? GE Greater/equal-büyük/eşit Sonuç >= verilen değer? LT Less than-daha az Sonuç < verilen değer? GT Greater than-daha çok Sonuç > verilen değer? LE Less/equal-az veya eş Sonuç <= verilen değer? Tablo VII - Bxx, DBxx ve Sxx koşullu branch komutlarında xx yerine gelebilecek takılar.

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