Amiga Dunyasi - Sayi 19 (Aralik 1991).pdf - Retro Dergi
Amiga Dunyasi - Sayi 19 (Aralik 1991).pdf - Retro Dergi
Amiga Dunyasi - Sayi 19 (Aralik 1991).pdf - Retro Dergi
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
DİLLER<br />
lamamız gerekli. Bu yüzden az yukardaki satırların başına bir de<br />
şu satırları eklemeliyiz:<br />
move.l GfxBase,a6 ; graphics.library başlangıci<br />
mo\e.l 50(a6),SysCopper ; sistem copper'ını saklar.<br />
Programın çıkış rutinine geldiğimizde de aşağıdaki satırları eklememiz<br />
gerekmekte:<br />
move.l GfxBase,a6 ; graphics.libraıybaşı.<br />
move.l SysCopper,50(a6) ; Eski copper'ı aktif hale getirir.<br />
Sizin de anlayabileceğiniz gibi iki yöntem arasında tek fark.<br />
copper'ın nasıl set edildiğinde yoğunlaşıyor. Geri kalan satırlar<br />
tümüyle aynı.<br />
Copper listemizi nasıl aktif hale getirip kapayabileceğimizi<br />
böylece öğrenmiş olduk. Şimdi gelelim esas konumuz olan copper<br />
listemizde yukarıda bahsettiğim komutların kullanımına. Bunun<br />
için vermiş olduğum listeye bakmanız yeterli. Listenin en<br />
sonunda COPPER label'ından sonra gelen kısım tümüyle bizim<br />
yeni copper listemiz. Dilerseniz burayı hemen bir inceleyelim.<br />
Copper listesinin ilk satırındaki komut, $5200 değerini $0100<br />
register'ina atıyor. Bunun anlamı mı ne $0100 register'ının ismi<br />
BPLCON0. Bu register-yardımıyla ekranın bazı önemli bilgilerini<br />
tanımlayabiliriz. $5200'ün anlamı 5 bitplane ($5000) ve composite<br />
renkli video sinyali (+$200) anlamına gelmekte. Bu<br />
register'daki diğer bitlerin anlamlarını. Doğan Türküler Hardware<br />
köşesinde diğer copper register'larıyla beraber açıklayacak.<br />
Biz şimdilik BPLCON0'ı bitplane adedimiz seçmek için kullanıyoruz.<br />
Örneğin 3 bitplane için buraya yazmamız gereken değer<br />
$3200 olmalıydı.<br />
Bundan sonraki dört satır ile DIWSTRT ($008e), DIWSTOP<br />
($0090), DDFSTRT ($0092) ve DDFSTOP ($0094)<br />
register'larına belli değerler yazıyoruz. Bu değerler yardımıyla<br />
ekran büyüklüğünü etkileyebiliriz. Örneğin DIWSTRT ve<br />
DIWSTOP ile oynayarak Overscan ekran yaratabiliriz. Bunu ilerde<br />
kullanacağımız için pek değinmiyorum. Yalnız verdiğim değerlerin<br />
normal bir 320*256 ekran yaratmak için kullanılan değerler<br />
olduğunu söylemeliyim.<br />
$0108 ve $010a register'ları BPLİMOD (tek numaralı<br />
bitplane'ler için modulo) ve BPL2MOD (çift numaralı<br />
bitplane'ler için modulo) isimlerini taşımaktalar. Buraya yazacağımız<br />
değerler, bir sonraki satırın adresini bulmak için her ekran<br />
satırı sonunda ekran adresine eklenecek modulo değerlerini bdirler.<br />
Verdiğim örnekte bitplane'ler hafızada altalta yer aldığı için<br />
modulo değerleri 0 olmalıdır. Eğer bitplane'lerimiz özel bir amaç<br />
için yanyana dizilmişlerse, her iki modulo'yu da uygun değerlere<br />
ayarlamalıyız. İlerde blitter konusuna girdiğimizde hızdan kazanmak<br />
için bitplane'leri bu şekilde kullanacağız.<br />
Copper listemizde bundan sonraki 10 satır ile bitplane adreslerini<br />
tanımlayabiliriz. $00e0 ve $00e2 (BPL1PTH ve BPL1PTL)<br />
ilk bitplane'in high ve low word'unu taşır. Aynı şekilde diğer<br />
bitplane'ler tanımlandıktan sonra renkleri tanımlıyoruz. Bunun<br />
için renk register'larına istediğimiz renk değerini $0rgb olarak<br />
yazıyoruz, r, rengin kırmızı oranını, g-ve b'de yeşil ve mavi oranlarını<br />
belirler. Renk register'ları $0180'den sonra gelen 32<br />
word'dur (COLOR00-COLOR31). Verdiğim örnekte bütün<br />
renk register'larını sıfırladım. Programınızda resim ya da yazı<br />
kullanacağınız zaman, bunlara ait renkleri bu register'lara yazmalısınız.<br />
Bundan sonra gelen satırlar sprite datalarının yerlerini tanımlamak<br />
için kullanılır. Fakat biz programımızda hiç sprite kullanmadığımızdan<br />
bunları da sıfırlıyoruz. Sprite kullanılacağı zaman,<br />
sprite'ın hafıza bulunduğu adresin üst ve alt word'unu bu adreslere<br />
(SPRxPTH ve SPRxPTL) yazmalısınız. Sprite'lar hakkında<br />
şimdilik bir noktaya daha değineceğim. Mouse pointer'ı da bir<br />
sprite'dır. Sprite O'ın adresini sıfırladığımız zaman sprite<br />
pointer'ı yok olacaktır. Bu yüzden programınızda mouse'u kapamak<br />
istiyorsanız sadece sprite 0 adreslerini 0 yapmanız yeter.<br />
Şimdi dilerseniz programımızın kalan bir-iki ufak bilinmeninin<br />
de açıklayalım. Programın Loop label'ından sonraki iki satırı,<br />
ekran tarama ışınının ekran sonuna gelip gelmediği kontrol edilir.<br />
Bunun için $dff006 register'ının içeriğine bakılır. Bu register'ın<br />
ismi VHPOSR'dir ve ekran tarama ışının o anki konumunu gösterir.<br />
Eğer ekran tarama ışını 256. satıra (=$ff) geldiyse progra-<br />
mımıza devam edilir. Aksi halde bekleme devam eder. Bu iki satırın<br />
amacı şu: Programlarımızda hareketli şeyler kullanmaya<br />
başlayınca bazen ekranda hareket eden kısımların titremeye başladıklarını<br />
görürsünüz. Bu, ekran tarama ışının tüm hareketleri<br />
aynı anda gösteremeyeceğindendir. Bu durumda işlemlere başlamak<br />
için ekran tarama ışının ekran sonuna varması beklenir.<br />
Bütün ekrandaki hareket işlemleri bu sayede ekran tarama ışını<br />
ekran dışında olduğu zamanlar yapılır. Ekran tarama ışınımız, ekranı<br />
0. satırdan itrbaren yeniden taramaya başladığı zaman da bütün<br />
değişen pikselleri update edecektir. Bu şekilde ekrandaki<br />
ufak tefek titremeleri de kaldırabiliriz. İlerde intro ve demo yazarken<br />
bu yöntemi umduğumuzdan da çok kullanacağız.<br />
Mouse label'ından sonraki satırlarda $bfe()01'in 6. bitini kontrol<br />
ediyoruz ve bu bit 0 ise programın çıkış rutinine geçiyoruz.<br />
Bu bit, mouse'un sol tuşunun konumunu gösterir. 6. bit 0 değerini<br />
taşıyorsa mouse'un sol tuşuna basıldı demektir. Mouse'un sol<br />
tuşuna basılmamış ise Loop label'ına geri dönülür. Devamlı tekrar<br />
edilmesini istediğimiz rutinleri bu yüzden Mouse label'ından<br />
hemen öncesine koymalıyız. Bu rutinler, mouse tuşuna basılana<br />
kadar tekrar edilir.<br />
Hay allah, ne güzel tam öğrenmeye başlamışken yerimiz yine<br />
bitti. Programın başka açıklanacak yeri de kalmadı zaten. Gelecek<br />
ay, copper listesini kullanarak ufak bir rutin yazmaya ne<br />
dersiniz Hem bu şekilde copper listesinin esas kullanılış şeklini<br />
de tam olarak görebilirsiniz. Hepinize bol byte'lı günler.<br />
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><br />
; >>>>GELISMIS ASSEMBLER - ÖRNEK PROGRAM >> TEMEL RUTİN . >> by :Cem GENCER /<strong>19</strong>92 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><br />
Q:<br />
Loop:<br />
Mouse:<br />
movem.l a0-a6/d0-d7,-(a7)<br />
bsr.s<br />
Init<br />
cmp.b #Sff,$dff006<br />
bne.s Loop<br />
btst #6,$bfe001<br />
bne.s Loop<br />
beq.s Final<br />
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><br />
; >» Turn alt-rutinler buradan sonra ... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><br />
Final:<br />
Init:<br />
lea SysCop,a0<br />
move.l (a0),50(a6)<br />
movem.l (a7)+,a0-a6/d0-d7<br />
rts<br />
move.l 4,a6<br />
lea GfxName,a1<br />
jsr -408(a6)<br />
move.l d0,GfxBase<br />
move.l GfxBase,a6<br />
lea SysCop,a0<br />
lea Copper.a1<br />
move.l 50(a6),(a0)<br />
move.l al,50(a6)<br />
rts<br />
«<br />
AMIGA DÜNYASI 38