Bu sayfadaki yazılar
Sayfanın metni
Sayfa 52
Immediate: MOVE.L #556,DO SUB.W #2,A0
Böylece adresleme modlarının sonuna gelmiş olduk. Bu modların isimlerini ezbere bilmenize tabii ki gerek yok, sadece aklınızda bulunsunlar, gerektiğinde elinizdeki araçları ve nasıl kullanıldıklarını bilin yeterli. Burada verdiğim örneklerin çoğunda MOVE komutunu kullandım ancak bu modlar neredeyse tüm komutlar için geçerlidir (ADD, SUB, BTST, NOT, EOR vb.)
Şimdi sırada Amiga'nın belki de en can alıcı konularından biri olan Copper var.
Copper
Copper, Amiga'nın Custom chip'lerinden biridir, çoğunlukla grafik işlemleriyle ilgili kullanılmasına karşın genel amaçlı olarak da kullanılabilir; ses, blitter ve sprite'ları kontrol edebilir; blitter aracılığıyla hafızada blok kopyalama işlemi yapabilir. Amiga'nın multitasking yapısında çok önemli bir yeri vardır, çünkü copper 68000'den bağımsız çalışır, kendi komutlarını işlerken CPU'ya yük olmaz. Bu sayıda copper komutlarını, bir copper listesini nasıl aktif edebileceğimizi, copper ile ilgili adresleri ve son olarak da bazı örnek copper uygulamalarını göreceğiz.
Copper Komutları
Copper bu kadar çok işi sadece 3 komut ile gerçekleştirir. Bu komutlar WAIT, MOVE ve SKIP'tir. Copper komutları program içinde bir liste halinde verilir. Pek çok Amiga programında uzun listeler halinde bu komutları görebilirsiniz. Bu listeler aslında copper'ın belirli raster satırlarını bekleyip belirli adreslere istenen değerleri yazmasını sağlayan komut listeleridir. Bu listelere “Copper List” denir.
Bir copper komutu 2 word'den oluşur. Basit bir copper listesi aşağıdaki gibi görünür:
DC.W $A001, $FFOO DC.W $0180, $OBBB DC.W $A101, $FFOO DC.W $0180, $0CCcc DC.W $A201, $FFOO DC.W $0180, $OAAA DC.W $FFFF, $FFFE
Bu listeyi şöyle özetleyebiliriz, $A0'ıncı raster pozisyonunu bekle, arkaplan rengini gri ($0BBB) yap, $A1'i bekle, rengi $0CCC yap, $A2'yi bekle, rengi $0AAA yap, listeyi bitir.
Şimdi sırasıyla copper komutlarını inceleyelim.
WAİT
Bu komut istenen x,y raster pozisyonunun beklenmesini sağlar. Evet, copper dikey tarama pozisyonu (vertical blanking) bekleyebildiği gibi yatay tarama pozisyonunu da (horizontal beam position) bekleyebilir. WAIT komutu aşağıdaki gibidir:
DC.W $YYXX, ŞAABB
Burada YY beklenecek dikey raster pozisyonu, XX yatayda beklenecek raster pozisyonudur. AA ve BB ise dikey ve yatay karşılaştırma bitleridir. XX ve YY'nin sadece istenen bitleri raster pozisyonu ile karşılaştırılır. Şimdilik bu aklınızı çok karıştırmasın. AA olarak $FF verdiğinizde tam olarak belirttiğiniz raster satırı beklenir. Benzer şekilde BB olarak $FE verdiğinizde de belirttiğiniz yatay pozisyon beklenir.
Burada ayrıca ilk word'ün ilk biti 1, ikinci word'ün ilk biti 0 olmalıdır. Bu, komutun WAIT olduğunu belirler.
;50.raster satirini bekle ;X pozisyonunu dikkate alma DC.W $5001,$FFOO ;255.raster satirini bekle pozisyonunu dikkate alma DC.W $FFO1,$FFOO ;160.Y pozisyonu ve ;7129.X pozisyonunu bekle DC.W
Burada masking bitlerini interrupt ile birlikte kullanarak, örneğin her 16 satırda bir işlem yapılmasını sağlayabiliriz. Bu konuyu daha ileride göreceğiz.
Aklınıza aşağıdaki copper listesinin çalışmayacağını düşünebilirsiniz:
DC.W $A001,$FFOO DC.W $9001,$FFOO
Burada önce $A0 daha sonra ise $90. raster pozisyonunu beklemeye çalışıyoruz. $A0'dan sonra $90'lı beklemek (zaten geçmiş olan bir pozisyonu beklemek) tüm tarama zamanını alacaktır. Ancak WAIT komutunun çalışma şekline baktığımızda durum düşündüğümüz gibi değildir. WAIT komutu raster pozisyonu (raster beam position) verilen pozisyondan büyük veya ona eşit olduğunda devam eder. Yani yukarıdaki iki satırın ilki çalıştıktan sonra ikinci satır hemen geçilecektir. ($90. satır zaten geçilmiş olduğundan dolayı.)
Amiga'da PAL ekran için raster pozisyonu (0,0)'dan (312,226), yani toplam 312 dikey raster satırı ve 226 yatay pozisyon vardır. Bu nedenle copper yatayda 226'dan ($E2) sonrasını bekleyemez. Ayrıca WAIT komutunun yatay/dikey pozisyon parametreleri 8 bit olduğunda 255. raster pozisyonuna kadar bekleyebilir. 255'ten sonraki raster satırlarını nasıl bekleyeceğimizi daha ileride göreceğiz.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 53
komutunun bitleri aşağıdaki gibidir:
İlk word Açıklama Bit 0 Daima 1 Bit 15-8 Dikey pozisyon, Vertical beam position (VP) Bit 7-1 Yatay pozisyon, Horizontal beam position (HP) İkinci word Açıklama Bit 0 Daima 0 Bit 15 Bu bit 1 olduğunda WAIT komutu pozisyon ile birlikte aynı zamanda blitter'ın işini bitirmesini de bekler. (Blitter-finished-disable bit) Bit 14-8 Dikey karşılaştırma bitleri, Vertical position compare enable bits (VE) Bit 7-1 Yatay karşılaştırma bitleri, Horizontal position compare enable bits (called HE).
Burada dikkat ettiyseniz ilk word'ün ilk biti 1, ikinci word'ün ilk biti ise 0. Bu, komutun WAIT komutu olduğu anlamına gelir. İlk word'ün 0'ıncı biti 0 olduğunda ise komut MOVE komutu olarak yorumlanır.
MOVE
MOVE komutu bir hardware register'ına yazma işlemi yapabilmemizi sağlar. Bu sayede sistemin birçok bileşenini kontrol edebiliriz. Hardware register'larının $DFF000-$DFF1FE arasında olduğunu biliyoruz. Ancak MOVE komutunun bazı kısıtlamaları vardır:
1. MOVE komutu $000-$010 arasındaki ($DFFO00-$DFF010) yazma işlemi yapamaz!
register'lara
2. $010 ile $020 arasında register'lara yazma yapabilmesi ancak COPCON (Copper Control, $02E) register'ının Copper Danger bitinin (0'ıncı bit) 1 olmasıyla mümkündür.
3. $020'den büyük tüm register'lara yazma işlemi yapabilir.
MOVE komutunun bitleri aşağıdaki gibidir:
İlk word Açıklama Bit 0 Daima 0 Bit 8-1 Hardware register adresi Bit 15-9 Kullanılmıyor, 0 yapın İkinci word Açıklama Bit 0-15 Yazılacak değer
Aşağıdaki örnek copper listesi BPLCON0 ($0100) adresine $1200 değerini yazar, bu, tek bitplane'lik (2 renkli) bir ekran açılmasını sağlar. 2 ve 3. satırlarda BPL1PTH ($0E0) ve BPL1PTL ($0E2) adreslerine $0002 ve $0000 değerleri yazılır. Bu register'lar bitplane'in hafıza adreslerini tutar. Örnekte bu adres $00020000 olarak verilmiştir. Hemen ardından COLOR000 ($0180) adresine $0222 (koyu gri renk) değeri yazılır, COLOR01 ($0182) renk register'ına $0FFF değeri (beyaz) yazılır ve liste sona erdirilir.
DC.W $0100,$1200 DC.W $00E0O,$0002 DC.W $00E2,$0000 DC.W $0180,$0222 DC.W $0182,$0FFF DC.W SKIP
SKIP komutunun bitleri WAIT komutu ile aynıdır, tek fark her iki 0'ıncı bitin de 1 olmasıdır:
İlk word Açıklama Bit 0 Daima 1 Bit 15-8 Dikey pozisyon, Vertical beam position (VP) Bit 7-1 Yatay pozisyon, Horizontal beam position (HP) İkinci word Açıklama Bit 0 Daima 1 Bit 15 Bu bit 1 olduğunda verilen pozisyon ile birlikte aynı zamanda blitter'ın işini bitirmesi de beklenir. (Blitter-finished-disable bit) Bit 14-8 Dikey karşılaştırma bitleri, Vertical position compare enable bits (VE)