Bu sayfadaki yazılar
Sayfanın metni
Sayfa 54
Bit 7-1 Yatay karşılaştırma bitleri, Horizontal position compare enable bits (HE).
SKIP komutu raster pozisyonu, verilen değere eşit veya büyük olduğunda bir sonraki komutun işlenmeden geçilmesini sağlar. Normalde bu komuta çok fazla ihtiyaç duymayız. Aşağıdaki örnek satır, dikey raster pozisyonu 100'ü ($64) geçtiyse bir sonra gelen komutun atlanmasını sağlar.
DC.W $6401,$FFO1
Copper Listesini Durdurmak
Bir copper listesini nasıl hazırlayacağımızı, istediğimiz pozisyonu nasıl bekleyeceğimizi biliyoruz. Peki bir copper listesini nasıl durduracağız? Aslında gayet basit; copper listesi asla ulaşamayacağı bir pozisyonu bekletildiğinde sona erer ve bir sonraki taramada başa döner. Aslında copper listesi her taramada baştan yüklenir, yani oluşturduğunuz liste bir taramayı aşıyorsa eğer yarım kalacak ve yeni taramada liste başa alınacaktır. Aşağıdaki WAIT komutu copper listesini sona erdirir.
DC.W $FFFF,ŞFFFE
Burada X ve Y pozisyonu olarak $FF ve $FF'i bekletiyoruz, ancak biliyoruz ki yatayda copper en fazla $E2'ye kadar bekleyebilir. Bu şekilde sistem copper listesinin sona geldiğini anlar ve sonraki tarama başlangıcında listeyi baştan başlatır.
Copper Listesini Çalıştırmak
Bir copper listesini oluşturduktan sonra çalışmasını sağlamak için aşağıdaki 2 yöntemden birini kullanmalıyız.
Doğrudan hardware yazmaçlarına copper listesinin adresini yazmak ve copper'ı tetiklemek veya graphics.library aracılığıyla copper'ı aktive etmek.
Bir copper listesi oluşturduktan sonra aşağıdaki şekilde aktif hale getirebiliriz:
LEA LEA MYCOPPERLİST,Al MOVE.L A1,$80(A0) MOVE.W #0,$88(A0)
Burada ilk olarak $DFF000 (custom chip base address) A0 register'ına alınıyor. İkinci satırda MYCOPPERLIST isimli label adresi (bizim oluşturduğumuz copper listesi) A1'e alınıyor. A1'deki değer (copper listemizin adresi) A0'daki adresin $80 ilerisine, $DFF080 (COP1LC) adresine yazılıyor. Son olarak $DFF088 (COPJMP1) adresine herhangi bir değer yazılarak copper listesinin tetiklenmesi sağlanıyor. (Bu adres bir strobe adrestir, yani herhangi bir yazma işlemi yapıldığında bir işlemi tetikler)
COP1LC ve COPJMP1 adreslerine istediğimiz zaman yazabilir ve copper'ın farklı bir listeyi göstermesini sağlayabiliriz, hatta bu adreslere copper kendisi de yazma işlemi yapabilir, bu şekilde copper'ı kendi içinde bir döngüye sokabiliriz.
İkinci yöntem ise graphics.library'yi kullanmaktır.
;Grafik kutuphanesini ac
MOVE.L $4,A6 MOVE.L #GEXNAME, A0 JSR OpenLibrary(A6)
;Hata varsa D0-0 olur TST.L DO BEO ERROR ;Gfx librarynin ofset A6ya al
MOVE.L DO,A6 ;Copper listesini calistir LEA MYCOPPERLIİST,AO MOVE.L
Burada “OpenLibrary” ifadesini kullanabilmek için elbette kodun başında graphics.i'yi include etmek gerekir. Veya “JSR OpenLibrary(A6)” yerine “JSR -408(A6)” da yazabilirsiniz.
Bir demo, intro veya oyun yazdığımız zaman açtığımız tüm kütüphaneleri kodun sonunda kapamalı ve eski copper adresini geri yazmalıyız. Bu, temiz bir çıkış için gereklidir. Örneklerde bunun nasıl yapıldığını görebilirsiniz.
Copper
ile neler yapılabilir
Bir copper listesi ile aslında makinenin neredeyse tüm kaynaklarına ulaşabilirsiniz. Tüm hardware register'larına yazabilir, blitter ile veri transferi yapabilir, ses veya sprite'ları kullanabilirsiniz.
Ancak en yaygın kullanım şekilleri şunlardır: ekranda çeşitli renk efektleri oluşturmak (raster barlar ya da Amiga'da daha yaygın söylenişiyle copper bar), sprite multiplexer (aynı numaralı sprite'ların belirli bir raster pozisyonundan sonra tekrar kullanılması), ekran/bitmap/sprite renklerinin veya data göstergeçlerinin istenen rasterlarda değiştirilmesi (2 renkli bir ekran açıp yüzlerce renk kullanabilirsiniz), hatta ekranın üst yarısı 320x256 çözünürlükte iken alt yarısını 640x256 yapabilirsiniz veya bitmap pointer'larını her satırda değiştirerek bir resmi ters gösterebilir, daraltıp uzatabilir, flood efekti yapabilirsiniz.
Örnekler
Sıralama (Sorting)
Aşağıdaki kod parçası <table>'da verilen tablodaki değerleri büyükten küçüğe doğru sıralamaktadır.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 55
D0'da sıralanacak sayıların adedinden geriye doğru sayan değer, A0'da tablo adresi bulunmaktadır. D7 geçici (temporary) olarak kullanılmış, D6'da ise sıralama işlemini gerekiyorsa tekrarlamak için bir flag tutulmaktadır. Kodu derleyip çalıştırdıktan sonra Asmpro'da “H table” yazarak tablonun son halini görebilirsiniz.
sort: lea table(pc),a0 moveg #8-2,d0 moveg #0,d6 loop:
;A0daki deger ile ;A04*2deki degeri
move.w (a0) şdl cmp.w 2(a0),d1 bgt.s pass swap:
ile A04*2nin ;degerlerini degistir
move.w move.w 2(a0), (a0) move.w d7,2(a0) moveg #1,0d6 pass:
#;tabloda ilerle #tablodaki degerler word ;oldugundan 2 arttiriyoruz dbf d0,loop ;herhangi bir degisiklik sort islemini
;tekrarla tst d6 bne.s sort table: de.w $0056,$0134,$0012,$0072
de.w $0145,$0001,$000Cc,$0025
Copper #1
Aşağıdaki örnek 320x256 tek bitplane (2 renkli) bir ekran açar. COLOR000 ($0180) renk register'ının değerini 225 raster satırı boyunca her satırda değiştirerek güzel bir copper bar oluşturuyor.
size - 320*256/8 bars - 22542 start
şekran adresini copper ;listesine yaz
move.l #myscreen,d0 move.w d0,sl swap dO move.w şekranin tamamini temizle lea myscreen,a0 move.l #size-l1,d0 loop move.b #$00, (a0) 4 Abi d0,loop
;copper listesinin icine ;sirasiyla wait ve move komutlarini
;yaz, toplam 225 adet move lea cp,a0 move.l #bars/2-1,d0 move.l #$0001£f00,d1 move.l #$01800000,d2 loop2 move.l d1,(a0)*4 move.l
;wait komutundaki raster ;pozisyonunu 1 artir add.l #$01000000,d1 ;move komutundaki renk degerini #bir artir add.w dbf
#$00000001,d2 d0,loop2
;custom chip base adresini al ;ve duzgun bir bitmap ekran icin gerekli degerleri
#yaz, 1 bitplane lo-res lea $Ad£f000,a0 move.w move.w #$0000,$108(a0) move.w move.w move.w #$2c81,$08e(a0) move.w #$2cc1,$090(a0)
;Copper list adresini $080e yaz
;copperi tetikle ($088e yaz) ;Ccopper dmasini ac lea mylist,al move.l a1,$80(a0) move.w move.w mouse btst #6,$bfe00l1l bne.s mouse out rts
;copper listesi ve bitmap ekran ;verilerini daima chip rame koy section data,data c
mylist #1 bitplane lo-res ekran ac ;bu degerin her taramada set şedilmesi gerekir, aksi halde ;bos veya bozuk bir ekran ; gorursunuz de.w $0100,$1200 ;bitmap pointlerlari
7$0e0 ve $0e2 adreslerinde ;hiword, loword olarak durur dc.w $00e0 sh do.w $0000 dc.w $00e2 sl dc.w $0000
move komutlari icin (450 long word) bars ŞEfİf,Ş$fffe
;wait ve ;yer ayir cp ds.l dec.w
şekran icin yer ayir myscreen
dcb.b size,$00
Evet işte basit bir copper örneği. Bu örnekte geçen bitmap ekran açma, ekran pointer'larını set etme gibi işlemleri önümüzdeki sayıda detaylıca göreceğiz. Şimdilik copper listesinin dinamik olarak nasıl oluşturulduğu ve nasıl aktif hale getirildiğini inceleyiniz.
Örnek kodlar hakkında anlayamadıklarınızı mail ile sorabilirsiniz.