Bu sayfadaki yazılar
Sayfanın metni
Sayfa 34
minterms[8], blitter işlemlerinde kullanılan minterm bilgisini (blitter işlem kodunu belirler) taşır. Blitter ve minterm hakkında daha detaylı bilgiyi diğer assembler yazımda detaylı olarak açıklayacağım. Bundan sonraki iki word PenWidth ve PenHeight, çizim kalemimizin boyutlarını belirlemeye yarar. TextFont longword'u kullanılan font'un structure'ını gösteren bir pointer. AlgoStyle yazı yazarken kullanılacak yazım modunu belirler. Bu yazım modu yardımıyla aynı fontla değişik stillerde (italik, altı çizgili ya da bold) yazılar yazabilmek mümkün. Tablo III'te bu yazı stilleri ve kodları yer almakta. Bundan sonraki 5 data, kullanılan fontla ilgili bazı bilgiler içeriyor. İlk bilgimiz TxFlags. Bu word, kullanılan fontun tipini belirleyen flag'lerin yer aldığı word'dür. Bu flag'lerin anlamlarını Tablo IV'de görebilirsiniz. TxHeight, kullanılan fontun yüksekliğini, TxWidth ise genişliğini gösteren iki word'dur. TxBaseline, fontun taban çizgisinin font içinde ne kadar yükseklikte kaldığını belirler. TxSpacing ise her karakter arasında bırakılacak boşluğu gösteren bir word'dur. Son longword'ümüz olan RPJUser, özel kullanımlar için ayrılmıştır. Bundan sonra gelen 32 byte'lık alan ise ilerki gelişmeler için rezerve edilmiştir.
Rastport structure'ını da bitirdiğimize göre artık Bitmap structure'ına geçebiliriz. Bu hayli kısa bir structure (40 byte). Bu yüzden fazla yer kaplayacağını sanmam. Yine bu structure'ı düzenli bir şekilde ofset değerleriyle tablo olarak veriyorum (Tablo V).
BytesPerRow ile, o bitmap'te satır başına düşen byte sayısı belirlenir (=(piksel sayısı/8)+1). Rows, satır adedini belirler. Flags, bize o bitmap'de kullanılan flag'leri gösterir. BitMap structure'ımızdaki 5. byte olan Depth o bitmap içersinde kullanılan bitplane adedini gösterir. Pad adıyla tanımlanan word boştur ve ileriki kullanımlar için rezerve edilmiştir. 8. byte'tan sonra yer alan tablo, bitmap'e ait tüm bitplane'leri gösteren bir tablodur. Sırayla her bir longword'de bitplane'lerin adresleri yer alır. Gördüğünüz gibi sistem structure'ları aslında 8 bitplane için rezerve edilmiş. Bu ilerde yapılabilecek geliştirmeler içindir. Her konuda olduğu gibi Amiga library'ler ve structure'lar ilerki gelişmelere yönelik hazırlanmış. Bu şekilde bilgisayar devamlı kendini yenileyebilmekte. Oysa Amiga'dan üstün birçok bilgisayar geliştirilemediğinden batmış durumda (bu bilgisayarlar en güzel örnek Archimedes bilgisayarı). İlerisi için düşünülüp rezerve edilen byte'lara dokunmamanızı öneririm. Programınız KickStart'ın yeni versiyonlarında sorun çıkarabilir.
Programımızda açıklayacağım iki altyordamdan biri INITBITMAPS. Burada ilk önce graphics.library base'ini A6'ya atıyoruz. Bu şekilde bundan sonra jsr - xxx(A6) komutu kullandığımızda graphics.library'den bir fonksiyon kullandığımıza emin olabiliriz. Her zaman bir library fonksiyonunu çağırmadan önce doğru library base adresini A6 register'ına atın. Aksi halde böyle saçma sapan bir hata epey değişik sonuçlar doğurabilir. Siz de programı yazmak için harcadığınız sürenin en azından 2 katını hatayı aramak için geçirirsiniz. Bazen böyle çok ufak hatalar göze çarpmaz. Her neyse, gelelim sonraki satırlara. Burada yeni bir library fonksiyonu görüyoruz: INITBITMAP. Bu fonksiyon yardımıyla bir bitmap açabiliriz. Bunun için fonksiyonu çağırmadan önce bazı register'lara değerler atamalıyız. Bu değerlerden ilki, bitmap structure'ını barındırabilecek büyüklükte bir hafıza alanı. Bu alanın aynı anda çalışabilecek başka programlar tarafından da yanlışlıkla silinmesini engellemek için bölgeyi BLK komutu ile rezerve etmeliyiz. Hafıza ayırmak için bir diğer yöntem de exec.library'sindeki AllocMem fonksiyonu. Fakat bunu daha ilerde göreceğiz. Bitmap structure'ımızın bulunacağı hafıza bölgesinin başlangıç adresini A0 register'ına atmalıyız. D0'a bitmap'de kullanılacak bitplane adedini gireriz. D1 ve D2 register'ları da bitmap'imizin kaç piksel büyüklüğünde olacağını belirlemek içindir. InitBitMap fonksiyonunun library ofseti, -390 ($186)'dır. Bitmap'imize ait bitplane'lerin her birinin adresini de belirlememiz gerekmekte. Bunu aşağıda yapacağız.
Bu alt rutindeki ikinci kullanılan library fonksiyonu InitRastPort. Kullanımı gayet basit. Açılacak RastPort structure'ını barındıracak bir hafıza bölgesinin adresini A1'e atamamız ve fonksiyonu çağırmamız yeterli. Fonksiyonun library ofseti -198 (=$c6).
InitBitMap ve InitRastPort fonksiyonlarının parametrelerini Tablo V'te görebilirsiniz.
InitRastPort fonksiyonunu çağırdıktan sonra structure için ayrılan bölgede sadece bazı temel datalar değişecektir. Bunlar şöyle: Mask, FgPen, BgPen ve LinePtrn isimli datalar -1 ($ffff) değerini; DrawMode datası ise 1 (=JAM2) değerini alır. Font dataları ve pointer'ı, kullanılan sistem fontunu gösterir. Bu yüzden RastPort structure'ındaki BitMap datasını değiştirmemiz gerekmekte. Bunu da 'move.l #SBITMAP,SRAST+4' satırıyla gerçekleştirdim. Az önce açtığımız bitmap structure'ının adresini (=SBITMAP) RastPort structure'ımızın (=SRAST) 4. byte'ından sonrasına longword olarak yazıyoruz. Böylece SBITMAP, SRAST structure'ına bağlı bir structure olacaktır. Şimdi de demin belirttiğim gibi bitmap structure'ındaki bitplane adreslerini doğru olarak girmemiz gerekmekte. Bir bitplane kullandığımız için sadece 8. ofsetteki longword'a PIC'in adresini yazıyoruz. PIC, programın sonunda tanımlanmış olan bir label. Bura-
Tanımı bit numarası Anlamı
MODE 640 15 Med-res PLNCNTMSK 14,13,12 Bitplane adedi (binary olarak) PF2PRI 7 Double playfield'de 2.playfield'i üste getirir. HOLDNMODIFY 11 HAM modunu açar. DBPLF 10 Double playfield modunu açar. INTERLACE 2 Interlace ekran açar. COLORON 13 Renkli grafik modunu açar/kapatır. Tablo II - RastPort structure'u grafik modu flag'ları
Tanımı Değeri Açıklama FSF NORMAL 0 Hiçbir özellik yok. FSF EXTENDED 8 Geniş font (60 kolonluk yazı ekranı) FSF ITALIC 4 İtalik yazı FSF BOLD 2 Bold yazı FSF_UNDERLINED
Tablo III- Font
1 Altı çizili yazı stilleri (kombinasyon yaratmak için değerleri toplayınız.)
Tanımı FPF ROMFONT FPF DISKFONT FPF TALLDOT FPF WIDEDOT FPF PROP. FPF REMOVED
Değeri 1 2 4 16 32 128
Açıklama Font ROM'da yer almakta. Font disketten yüklenmiştir. hires non-interlace modunda kullanmak için. lores interlace modu için font. Proporsiyonal font. Font hafızadan silinmiştir.
Tablo IV - Font flag'ları
Klavyeyle gezinmek için ← ve → tuşları.
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.