copper:
sadece 3 tane instructioni olan (move, wait, skip) bir "co-processor"'dir..
move komutu ile bir hardware register'ina deger atayabilirsiniz,
wait komutu ile istenilen tarama satirini bekletebilirsiniz,
skip komutu ile belirtilen tarama satirini gectiyseniz, islemleri skipleyebilirsiniz.
copper list diye bilinen bir komut listesi olusturulur ve copper'a "isleyecegin komutlarin listesi burada" denir ve copper islemeye baslar.. isin guzel yani bu copper listi "ana" program icinde istediginiz gibi degistirerek cpu'nun zamanindan kazanirsiniz.. ornegin;
copper_list:
dc.w $0100,$4200 ;4 bitplane
planes:
dc.w $00e0,$0000,$00e2,$0000 ;bitplane 1 adresi (high/low)
dc.w $00e4,$0000,$00e6,$0000 ;bitplane 2 adresi (high/low)
dc.w $00e8,$0000,$00ea,$0000 ;bitplane 3 adresi (high/low)
dc.w $00ec,$0000,$00ee,$0000 ;bitplane 4 adresi (high/low)
...
sprite1:
dc.w $0120,$0000,$0122,$0000 ; sprite1
...
dc.w $ffff,$fffe ; bitti
yukarida basit bir copper listemiz yani copper'in isleyecegi komutlarin listesi mevcut.. sprite ile devam edelim.
ornegin hareket eden bir spriteimiz var ve frame frame olarak (3 frame diyelim);
1. frame = 0x00500000
2. frame = 0x00501000
3. frame = 0x00502000
seklinde hafizada duruyor..
normalde(!);
move.l #$0005,d0
move.l #$0000,d1
move.l #$dff120, a0
move.l #$dff122, a1
loop:
move.l d0,(a0)
move.l d1,(a1)
_vbl bekle_
add #$1000,d1
cmp #$4000,d1
bne.s devam
move.l #$0000,d1
devam:
jmp loop
yani sirayla 3 frame sprite adresini set ederek ekranda animasyon halinde sprite gosterebiliriz.. ama bu konumda (copper varken) gereksiz register harcamasi sozkonusu..
---
yukaridaki copper listemizi aktif ettigimizde copper her taramada
dc.w $0120,$0000,$0122,$0000 ; sprite1
komutlari ile ilgili register'lara gerekli degerleri yukluyor, boylece en basitinden copper listemiz;
dc.w $0120
dc.w $0005
dc.w $0122
spr1l: dc.w $0000
ve code'umuz
move.l #$0000,d0
lea spr1h(pc),a0
loop:
move.l d0,(a0)
_vbl bekle_
add #$1000,d1
cmp #$4000,d1
bne.s devam
move.l #$0000,d1
devam:
jmp loop
sekline donusebilir.. bir nevi self modifying code yapmis oluyoruz..
son bir ornek ile bitirelim:
copper listemiz:
dc.w $2001,$ff00,$0180,$0010
dc.w $2101,$ff00,$0180,$0012
dc.w $2201,$ff00,$0180,$0014
dc.w $2301,$ff00,$0180,$0012
dc.w $2401,$ff00,$0180,$0010
burda 32, 33, 34, 35 ve 36nci tarama satirlarini bekle ve o satira ulasildiginda $180 (color0)'a ilgili satirlar icin $10,$12,$14,$12 ve $10 renklerini yukle dedik ve boylece ekranin 32 ve 36nci satirlari arasinda basit bir copper cubugu (copper bar/raster bar) olustu..
yine yukaridaki self modifying ornegini buna uygulayarak istersen bekleme satirlarini degistirip copper bar'i hareket ettirebiliriz veya renklerini degistirebiliriz..
gibi