15.01.2015 Views

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

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!