Amiga Dünyası sayı 18, sayfa 48

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 48

DERLEYİCİLER

mal kod olarak girmeliyiz. Bu dört komut, 68000 komutu olmadığından, Sega'da direkt kullanılamazlar. Biz yine de komutları isimleriyle inceleyeceğiz. Bu hem daha kolay, hem de akılda kalıcı olmakta.

Bu dört komut dışında copper'ın kullandığı registerler vardır. Bunlar, Amiga'nın hafızasında $dff000 adresinden itibaren sıralanırlar. Fakat copper, bunlara erişmek için $dff000'li bir adres kullanmaz; onlara direkt adresleriyle hitap eder. Aşağıdaki basit formülle direkt adresleri hesaplayabilirsiniz:

direkt adres=hafıza adresi –$dff000 Bu işi daha basit olarak yapmak için, hafıza adresinin başındaki $dff kısmını atarız. Elimizde kalan heksadesimal değer, copper içindeki direkt adrestir. Bu adresleri ilerde copper registerlerini daha detaylı olarak incelemeye başladığımızda göreceğiz.

Bu arada, bu komutları copper'a aktarabilmek için komut ve dataların heksadesimal karşılıklarını bir listeye yazmamız gerekir. Bu listeye COPPER LIST denmekte. Daha sonra da programınıza ufak bir rutin ekleyerek bu copper listesini aktif hale geçiririz; yani copper'ın bütün komut ve dataları işlemesini sağlamalıyız. Ancak bu şekilde copper, kendisine gönderilen komut ve datalar zincirini algılayabilir.

Copper listesindeki komutlar, ekran tarama ışını her ekran başına (VBLANK- Vertical BLANKing) geldiğinde copper tarafından işlenir. Ekranın tarama ışını tarafından saniyenin 60'da birinde bir defa tarandığını düşünürsek, copper listesi saniyede 60 defa işleme sokulur.

Ekran tarama ışını hem dikey, hem de yatay koordinatları için çalışmakta. Yatay tarama ışını, $00 ile $e2 arasında değer alabilir. Ekran tarama ışını karşılaştırmasında (CWAIT ve CSKIP komutlarında kullanılır) ilk bit kullanılmadığından, tarama ışını için yatay olarak 113 koordinat mevcuttur. Bu lo-res grafik modunda yaklaşık olarak 4 piksel; hi-res modu için ise 8 piksel anlamına gelmekte. Horizontal blanking işlemi, yatay $0f-$35 koordinatları arasında gerçekleştirilmekte. Blanking işlemi, tüm kullanılan registerlerin sıfırlanıp değerlerinin tekrar yazılması anlamına gelmekte. Normalde 320 piksel genişliğinde bir ekranda $04-$47 yatay koordinatları kullanılmaz. Burada sadece zemin rengi görülebilir.

Yatay tarama ışını, 256 satıra da erişebilir. Fakat normalde bir ekranda 256'dan daha fazla satır mevcuttur. Bu fazladan satırları beklemek için, ilk önce 256. satırı beklememiz gerekmekte. Burada ekran tarama ışını sıfırlanacaktır. 256. satırı (=$ff) bekledikten sonra, düşük değerli bir satır bekletirsek, bu satır 256. satırdan sonraki satırlara denk gelecektir. Ekranda bu şekilde yaklaşık 312 satır kullanılabilir.

Aşağıda dört komutun her birini binary açılımlarıyla bulabilirsiniz.

»» CMOVE komutu: 68000 komutlarında Move, bildiğiniz gibi bir yerden başka bir yere bilgi aktarmaya yarar. CMOVE da, move komutu gibidir. Bu komut yardımıyla herhangi bir copper registerine istediğiniz değeri yazabilirsiniz. Registere yazılacak data, cmove komutunun ikinci word'unda bulunur. Datanın yazılacağı register ise birinci word'da bulunmalıdır.

İlk word: bit 0: Devamlı olarak 0 değerini taşımalı, bit 1-8: Copper registerinin direkt adresi, bit 9-15: Kullanılmıyor: 0 değerini taşımalı.

İkinci word: bit 0-15: Copper registerine yazılacak bilgi.

Bu arada copper'ın direkt kullanımda $020 direkt adresinden yukarısına yazabileceğini unutmayın. Şayet Copper uyarı biti (Copper Danger Bit) set (= 1) durumda ise copper, $010-$020 adresleri arasındaki bölgeye de erişebilir. Bu uyarı biti, copper kontrol registerinde (COPCON) bulunmakta. Tekrar hatırlatayım; copper $010 direkt adresi aşağısına erişemez. Nedeni de bu registerlerin sadece okunabilir olmasıdır. Salt okunur registerler copper'ın bazı önemli bilgilerini içerir. Bunlardan bazıları, bilgi ara depolarıdır. Disk ünitesi gibi bir birimden gelen bilgi, ilk önce bu depoda kısa bir beklemeye alınır. Ardından gideceği yere otomatik olarak gönderilir. Salt okunabilir registerlere yazmaya kalkıştığınızda, bilgisayar crash edebilir!

Aşağıdaki data tablosunda copper listesi aracılığıyla belli registerlere bilgi yazmanın nasıl yapılabileceği görülebilir:

DC.W $00e0,$0002;$0e0 direkt adresine $0002 değerini yaz.

DC.W $00e2,$1000;$0e2 direkt adresine $1000 değerini yaz.

DC.W $00e4,$0002;$0e4 direkt adresine $0002 değerini yaz.

DC.W $00e6,$5000;$0e6 direkt adresine $5000 değerini yaz.

Yukardaki kısa örnek, ilk iki bitplane adreslerini tanımlamakta. Bunu $0e0-$0e6 registerleriyle (BPL1PTH, BPL1PTL, BPL2PTH ve BPL2PTL) yapmaktayız.

»» CWAIT komutu: CWAIT komutu, video tarama ışınının belli bir satıra geldikten sonra copper'ın işlem yapmasını sağlar. Bu sayede ekran oluşturulurken belli satırlarda değişik işlemleri otomatik olarak gerçekleştirebilir ve bu şekilde sistemi kandırabiliriz. Buna en basit örnek, renk registerleri kullanılarak yapılabilir. Ekranın belli satırını bekletir ve renk registerlerini o satırda tekrar tanımlarsak, ekranda iki katı fazla renk görülmesini sağlayabiliriz. Bu işlemi istediğimiz sıklıkta yapabiliriz. BEAST gibi oyunlarda çok kullanılan bu teknik sayesinde, aynı anda ekranda 32 renk mümkünken 256 renk kullanılabilmekte. Aslında her satırda renk registerlerini baştan tanımlarsak, 256 satır içinde 8192 farklı renk yaratabilmek mümkün. Fakat Amiga'nın hardware'i sadece 4096 renk kullanımına izin vermekte. Bu yine de ekranı bir hayli dolu gösterecek ve bilgisayarın hızı hiç azalmayacaktır.

Aynı işlemi, library'den yapmaya çalıştığımızı düşünelim. Her seferinde 32 renk için, bazı registerlere 32 defa değer atamamız ve daha sonra da graphics library'den renk değiştirme fonksiyonunu çağırmamız gerekmekte. Fakat yine de bu yöntemle ekranda 32'den fazla renk oluşturamayız; zira değiştirdiğimiz renkler ekranın tümündeki renkleri etkiler. Copper'da olduğu gibi belli satırlardan sonra renkleri değiştirmek library'ler aracılığıyla imkansız.

Yine konudan çok fazla açılmaya başladım; nerede kalmıştık? Evet copper, cwait komutu yardımıyla belli bir satırı bekler. Bu bekleme süresince copper devreden çıkar ve zaman harcamaz, istenen satıra gelindiğinde, copper hemen devreye girer ve cwait komutundan sonra gelen komuttan işlemeye başlar.

İlk word: copper'ın bekleyeceği koordinatı içerir, ikinci word ise, cwait komutunun kendisidir.

İlk word: bit 0: Devamlı 1 değerini taşımalı, bit 1-7: Yatay ekran tarama ışını koordinatı (HP - horizontal Position) bit 8-15: Dikey ekran tarama ışını koordinatı (VP - Vertical Position)

İkinci word: bit 0: Devamlı 0 değerinde olmalı, bit 1-7: Yatay karşılaştırma bitleri (HE - Horizontal Enable) bit 8-14: Dikey karşılaştırma bitleri (VE - Vertical Enable) bit 15: Blitter-finished-disable biti. Normalde bu bit 1 değerini taşır.

Maskeleme bitleri, copper'ın belli koordinattan beklemesini engellemek için kullanılmakta. Bu maske bitlerinden yatay karşılaştırma bitleri olanlarını, 0 konumuna getirirsek, ekran tarama ışını yatay koordinattan dikkate almayacaktır. Bu durumda ekran tarama ışınının sadece dikey koordinattan beklemesini sağlayabiliriz. Aynı şekilde dikey koordinattan kapayarak sadece yatay koordinattan da kullanmak mümkün.

Aşağıdaki örnekte copper, ekran tarama ışınının 150. satıra (=$96) gelmesini bekler.

DC.W $9601,$ff00 ;150. dikey koordi- natı bekle, yatay koordinatlara dikkat etme.

»» CEND komutu: Cend komutu, copper listesinin sonunu belirtmek için kullanılır. Aslında Cend komutu basit bir cwait komutundan başka bir şey değildir. Ekranda hiçbir zaman ulaşılamayacak bir noktayı bekletmemiz yeterli. Bu nokta da $ff dikey, $fe yatay koordinatlarıdır. 256. satırda 254. yatay koordinatı yoktur. Bu yüzden copper bir sonraki ekranın taranmasına başlamadan önce, devamlı bekleme konumuna geçerek zaman harcamaz. Aşağıdaki satırda copper bitirme komutunun kullanımı görülmekte:

DC.W $ffff,$fffe; $ff dikey, $fe yatay koordinatı bekle.

SÜRECE

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