BLITTER'I TANIYOR MUSUNUZ?
Retro bilgisayarTANIYOR MUSUNUZ?

AMIGA'NIN EN ÖNEMLİ ÖZELLİKLERİNDEN BİRİ DE, BLITTER'DIR. IŞIK HIZINDA ÇALIŞAN BLITTER, BİRÇOK ÖZELLİĞİ İLE ÇOK KUVVETLİ BİR HARDWARE PARÇASIDIR. BU YAZI ONUN GİZLİ YÖNLERİNİ AÇIĞA ÇIKARACAKTIR...
Hiç bilmeyenler için söyleyelim; Blitter çok kuvvetli ve bloklar halindeki hafızayı ışık hızında taşıyan bir grafik dinamosudur. Bir kere gerekli register ayarlamaları yapıldığında, Blitter saniyede bir milyon pixel datayı istediğiniz bir yerden başka bir yere transfer edebilir. Bazen kendi işini tamamlayabilmek için 68000'i bir kenara itmesi gerekir. Bu duruma 'Blitter Nasty' adı verilir. Blitter işi bitmedikçe, 68000'e data-bus gidişini engeller ve hepsini kendisi kullanır. Blitter çizgisel ve dikdörtgen şekildeki datayı, alt 512k bellek içinde modulo registerleri sayesinde dolaştırabilir. Ayrıca bilgisayar betimlemeli tasarımlarda kesinlikle ihtiyaç duyulan 'Line-Drawing' özelliği ile de desteklenmiştir.
Amiga'nın bu özelliğini öğrenmek, 68000 dilini kullanarak Amiga'nın hardware'ini onikiden vurmak isteyenler için vazgeçilmez bir ihtiyaçtır. Belki makinanın hardware'ine daha çok önem vererek program yazmak O/S meraklılarına ters gelebilir. Onlar ROM'un içindeki 'Library' dediğimiz kısa rutinleri kullanarak ya da Workbench'de ikonlarla oynayarak vakit geçirebilirler, ama gerçekten iyi bir oyun yapılacağı zaman, işin gerçeği tüm DOS'u unutmanız gereğidir. O andan itibaren Amiga sadece birçok chipleri ve boş bir hafızası olan bir makinadır. 'Library' dediğimiz rutinleri kullanmak
68000'in boşa zamanını yemekten başka bir şey değildir. Bu kısa programlar makinanın olmayan bir özelliğini ortaya çıkaramaz, sonuçta yine makinanın donanımını kullanmak zorundadır. Öyleyse bunu kendimiz doğrudan yapmak varken, niçin gereksiz yere genel durumlar için yazılmış, bu yüzden birçok şeyi gereksiz yere kontrol ya da manipüle eden rutinleri kullanalım? Bu yüzden Blitter'i doğrudan kullanmayı anlatacağım.
Blitter'in data taşımasında kullanılabilecek A, B, C ve D olmak üzere 4 kanalı vardır. A, B ve C source (kaynak) kanalı, D ise destination (hedef) kanalıdır. Ek olarak Blitter 'Barrel shifter' denilen bir kaydırıcıya sahiptir. Kaydırma sayesinde, datalar (herhangi bir grafik) pixel düzeyinde transfer edilebilir. Eğer bu olmasaydı datalar sadece word (16 pixel) düzeyinde transfer edilebilirdi. Çünkü Blitter, bir word blitterdir. Sanki bunlar yeterli değilmiş gibi, A, B ve C source kanalları üzerinde istenilen 256 mantıksal işlemden herhangi biri hiç bir zaman kaybına uğramadan yapılabilir. İstediğimiz genişlikteki bir data dizisini istediğimiz genişlikteki bir alandan çekip transfer edebilmek için Blitter'in her kanal için ayrı modulo registeri vardır. Buna ek olarak A, B, C ve D kanallarının nereye baktığını gösteren adres registerleri de vardır. Blit yapmak için (Blitter'in yaptığı işe blit denir), ilk başta kullanmak istenilen kanalların adres ve modulo registerleri ayarlanır. Daha sonra kaydırma bitleri (barrel shift) ve minterm (mantıksal işlem) değerleri tanımlanır. Ayrıca blit işlemi iki yönde de yapılabildiğinden, yön belirtilmelidir. Bütün bunlardan sonra blit işleminin büyüklüğü BLTSIZE denilen registere girilir ve Blitter donanımı ateşlenir.
Şimdi Blitter'in özelliklerini özetleyip, daha sonra blit işlemini yapmak için tanımlanması gereken her registeri teker teker anlatacağım.
Blitter Donanımı Ve Özellikleri 1 - Data Transferi: A, B, C ve D kanallarıyla saniyede 1 milyon pixele yakın data taşıyabilir.
2 - Adres ve Modulo Registeri: Bütün kanallar için aynı olan adres ve modulo registerleri sayesinde alt 512K içinde dikdörtgen şeklinde datayı herhangi bir yerden istenilen bir yere taşıyabilir.
3 - Artırarak Veya Azaltarak: Blitter iki yönlü çalışabilir. Yani isterse source ve destination bölgesinin altından başlar ve ilerlerken adres registerini azaltır veya source ve destination bölgesinin üstünden başlar ve data transferi yaparken adres registerini artırır.
4- Çizgisel Veya Dikdörtgen Şeklinde Taşıma: Blitter çizgisel veya dikdörtgensel alanlarda işlem yapabilir.
5- Mantık işlemleri: Blitter donanımı, tek bir yerden bilgi alıp başka bir yere transfer etmekle sınırlı değildir. Üç source kanalı sayesinde, bu kaynaklar istenilen mantıksal işlemlerle birleştirilebilir. Böylece grafik programlarında bulunan grafik efektleri kolayca yaratılabilir, (or, xor, and, not...)
6- Kaydırma (Shifting): Kaydırma sayesinde word (16 pixel=16 bit) seviyesinde çalışan Blitter'e pixel seviyesinde işlem yaptırılabilir.
7- Maskeleme: BLTAFWM ve BLTALWM registerleri sayesinde maskeleme yapılabilir ve pixel seviyesinde istenmeyen datalar atılabilir.
BLITTER FONKSİYONLARI
VE GEREKEN REGISTERLER
-Adres Registerleri: Bu registerler, 4 kanalın nereye baktığını gösterir. Source kanalları olan A, B ve C adres registerleri transfer edilecek datanın hafızanın neresinde başladığını gösterir. Destination kanalı olan D kanalının adres registeri de datanın transfer edileceği yeri gösterir. A kanalı BLTAPT $dff050 L(long word) B kanalı BLTBPT $dff04c L(long word) C kanalı BLTCPT $dff048 L(long word) D kanalı BLTDPT $dff054 L(long word)
Ayrıca, hangi kanallar kullanılacaksa bu kanallar BLTCON0 registerindeki 11, 10, 9 ve 8 numaralı bitlerden aktif duruma getirilmelidir.
-Modulo Registerleri: Blitter için modulo vazgeçilmez bir unsurdur, çünkü modulo sayesinde Blitter istediği genişlikte bir alanı istediği genişlikteki bir alandan alıp, istediği genişlikteki bir alana koyabilir. Her kanal için ayrı bir modulo registeri vardır. 30313233343536373839 (Sıralı rakamlar hafızadaki ----------------------- sıralı word uzunluğundaki 40414243444546474849 adresleri temsil ediyor.)
50515253545556575859
Eğer amacımız 31-35, 41-45 ve 51-55 numaralı wordlerin oluşturduğu dikdörtgen şekilli data parçasını blit etmek ise, moduloyu tanımlamamız gerekir. Modulo, büyük parçanın genişliği ile almak istediğimiz parçanın genişliği arasındaki farktır. Bu durumda 35. word ile 41. word arasında 5 word vardır. Yani, 31-35 dizisinden sonra 5 word atlanarak 41-45 parçasına ulaşılabilir. O zaman modulo registerine 10 değeri girilir. Çünkü modulo registeri atlanacak byte sayısını gösterir. (1 word = 2 byte) A kanalı BLTAMOD $dff064 W(word) B kanalı BLTBMOD $dff062 W(word) C kanalı BLTCMOD $dff060 W(word) D kanalı BLTDMOD $dff066 W(word) Alttaki iki register bundan sonra anlatılacakların daha iyi açıklığa kavuşmasını sağlayacaktır. Blit kontrol registerleri ve Blit kontrol register2 BLTCON0 - BLTCON1
Bit W(word) $dff040 W(word) $dff042
15 A shift 3 B shift 3 14 A shift 2 B shift 2 13 A shift 1 B shift 1 12 A shift 0 B shift 0 11 A kanalını aktifleme 10 B kanalını aktifleme 09 C kanalını aktifleme 08 D kanalını aktifleme 07 minterm 7 06 minterm 6 05 minterm 5 04 minterm 4 Exclusive fiil aktifleme 03 minterm 3 Inclusive fiil aktifleme 02 minterm 2 Fiil carry girişi 01 minterm 1 Azaltarak/Artırarak 00 minterm 0 Çizgi modu
NOT: BLTCON1 registerinin 0. biti açılırsa çizgi moduna geçilir. Bundan sonra BLTCON0 ve BLTCON1 registerinin görevi değişir.
•Artırarak Veya Azaltarak Modu: Eğer destination ve source adresleri birbirleri ile çakışıyorsa ve data hafızanın ilerki kısmına transfer ediliyorsa, azaltarak modu seçilmelidir. Yine eğer destination ve source çakışıyorsa ve de hafızanın gerisine doğru transfer ediliyorsa, artırarak modu seçilmelidir. Hangi modu istediğinize bağlı olarak BLTCON1 registerinin 1. biti değiştirilir. Azaltarak için bu bit 1 değerini alır. Artırarak modu için bu bit kapalı tutulur.
•Minterm (mantıksal işlemler): Üç source kanalı olan A, B ve C üzerinde istenilen 256 işlemden herhangi biri hiçbir vakit kaybı olmadan yapılabilir ve sonuç destination kanalıyla istenilen bir yere aktarılabilir. Peki, mintermlerin neyi anlattığı nasıl anlaşılır? İstediğimiz bir işlemi (minterm) nasıl tanımlarız?
işlemler ABCABCABCABCABCABCABCABC BLTCON0 7-0 bitleri 7 6 5 4 3 2 1 0
Üzeri çizililer, o kanalın NOT işlemi gördüğünü yani o kanaldaki bilginin tam tersinin alındığını anlatır. Yardımcı olması için temel mantık işlemleri olan AND, OR ve NOT'ın tablosu aşağıdadır. 1 AND 0 = 0 1 OR 0 = 1 NOT(1) = 0 1 AND 1 = 1 1 OR 1 = 1 NOT(0) = 1 0 AND 0 = 0 0 OR 0 = 0 0 AND 1 = 0 0 OR 1 = 1 Örnek olarak, 5. ve 1. bitleri açalım. Minterm değeri $22 (% 0010 0010) olsun. İşlem tablosuna bakarak formül ortaya çıkarılır.
D= ABC + ABC (çarpma işlemi AND, toplama işlemi OR'dur) = BC(A+A) herzaman (A+A)=1 = BC Böylece BLTCON0 registerinin 0-7 bitine $22 girilirse, blit işlemi sırasında B kanalındaki bilgi NOTlanır ve C kanalındakiyle AND'lenir. Sonuç D kanalıyla istenilen bir yere aktarılır.

Bazı önemli mintermler: D=A ($F0) D=B($CC) D=C($AA)
D=A XOR B ($3C) (Deluxe Paint III'ün animasyon saklama şekli)
Daha geniş bilgi için Amiga Hardware Manual'i inceleyin.
-Kaydırma (Shifting): Baştan beri söylediğimiz gibi. Amiga'nın Blitter'i word blitter'dir. Yani taşıyacağı bilgiyi word word taşır, pixel pixel (bit bit) değil. O yüzden aldığınız bir bilgiyi hafızanın içinde ikinin katı olan adreslere koyabilirsiniz. Bu da, 16 pixellik bir incelik sağlar. Fakat bu incelik, hiç yeterli değildir. Kullanıcı aldığı bilgiyi istediği pixelden itibaren koymak isteyecektir. Bunun için donanım, 'Barrel Shifter' ile desteklenmiştir. Bu, 1 pixel inceliğinde işlem yapma olanağı sağlar. Şöyle ki, herhangi bir datayı $70000 adresinin 5. bitinden itibaren yerleştirerek ekranda $70000 adresinin 5 pixel sağında görmek istiyorum. Yapmam gereken kaydırma değerini 5 vermektir. Fakat kaydırma yalnız A ve B kanalı için geçerlidir. BLTCON0 registerinin 15-12 bitleri A kanalı için, BLTCON1 registerinin 15-12 bitleri B kanalı için ayrılmıştır. Böylece bu bitlere 0 ile 15 arasında değer girilebilir ki, bu da Blitter'in 16 pixel (word)'lik işlem kesinliğini 1 pixellik bir kesinliğe çıkarır. •Maskeleme: Bu özellik, sadece A kanalı için geçerlidir. Gerekli registerler şunlardır: BLTAFWM $dff044 W(word) BLTALWM $dff046 W(word) Herzaman transfer edeceğimiz grafik, 16 pixelin (1 word'ün) tamamı olmayabilir. İstemediğimiz bilgiler, pixel düzeyinde atılmak istenebilir. İşte o zaman gereksiz bilgiler Blitter'in maskeleme kabiliyeti ile kapatılabilir. Maskeleme her iki registerin AND'lenip sonuçta '0' kalan bitlerin blit sırasında Blitter tarafından atılmasıyla olur. Örnek olarak BLTAFWM %1111111111001100, BLTALWM %0000110111110011 değerlerini alsın. Bu iki registerin AND'lenmesinin sonucu %0000110111000000 değeridir. Böylece 1., 2., 3., 4., 7., 11., 12., 13., 14., 15. ve 16. pixeller maskelenmiş yani atılmış olur. Word word yapılan blit sırasında 5., 6., 8., 9. ve 10. pixellere (bitlere) dokunulmaz.
-Blit Büyüklüğü: BLTSIZE registeri, blit işleminin büyüklüğünü tanımlar. Bu registerin tanımlanmasıyla Blitter donanımı ateşlenmiş olur. Yani yukarıda yazılı registerlerin tanımlanması blit işleminin başlaması için yeterli değildir. Son aşama olarak blit miktarı belirlenmelidir. Miktarın BLTSIZE registerine girilmesiyle daha önce tanımlanmış Blitter registerleri doğrultusunda blit başlar. BLTSIZE(yükseklik,genişlik) $dff058 W(word) Bit 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 y9 y8 y7 y6 y5 y4 y3 y2 y1 y0 g5 g4 g3 g2 g1 g0 Blit edilecek datanın grafik olduğunu kabul edersek, yükseklik bitlerine (15.-6. bitler) blit edilecek bölgenin pixel olarak yüksekliği, genişlik bitlerine de (5.-0. bitler) blit edilecek bölgenin pixel olarak genişliğinin 16 ile bölümü girilir. Diğer bir şekilde genişlik bitlerine blit edilecek bölgenin word olarak genişliği girilir. ( 16 pixel = 1 word ) Blit işlemi göründüğü kadar kolay değildir. Eğer blit işlemi bitmeden yeni bir blit emri verilirse, Blitter tüm hafızaya atlar ve sistemi crash ettirir. Bundan dolayı yeni bir blit emri verilmeden daha önceki blit işleminin bitip bitmediği kontrol edilmelidir. Bu kontrol DMACONR registerinin 14. biti olan 'Blitter Busy' bitinden yapılabilir. Bu bitin 1 değerini alması Blitter'in meşgul olduğunu, 0 değerini alması Blitter'in boş olduğunu gösterir. DMACONR $dff002 W(word) Artık bu kadar yardım yeterli. Gerisi siz meraklı arkadaşlarımıza kalmış. Blitter'in bütün bu özelliklerinin birleştiğinde ne kadar güçlü olduğunu söylememe gerek yok herhalde. Çünkü birçok baş döndürücü grafiklerin anime edildiği yabancı oyunlar bunun göstergesi. Fakat bu bilgileri daha da pekiştirerek neden siz de göze hoş gelen animasyonlar yapmayasınız? İyi blitler ...
