Amiga Dünyası sayı 19, sayfa 32

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 32

move.l GfxBase,a6 ; graphics.library başlangıcı move.l 50(a6),SysCopper ; sistem copper'ını saklar. Programın çıkış rutinine geldiğimizde de aşağıdaki satırları eklememiz gerekmekte:

move.l GfxBase,a6 ; graphics.library başı. move.l SysCopper,50(a6) ; Eski copper'ı aktif hale getirir. Sizin de anlayabileceğiniz gibi iki yöntem arasında tek fark, copper'ın nasıl set edildiğinde yoğunlaşıyor. Geri kalan satırlar tümüyle aynı.

Copper listemizi nasıl aktif hale getirip kapayabileceğimizi böylece öğrenmiş olduk. Şimdi gelelim esas konumuz olan copper listemizde yukarıda bahsettiğim komutların kullanımına. Bunun için vermiş olduğum listeye bakmanız yeterli. Listenin en sonunda COPPER label'ından sonra gelen kısım tümüyle bizim yeni copper listemiz. Dilerseniz burayı hemen bir inceleyelim.

Copper listesinin ilk satırındaki komut, $5200 değerini $0100 register'ına atıyor. Bunun anlamı mı ne? $0100 register'ının ismi BPLCON0. Bu register yardımıyla ekranın bazı önemli bilgilerini tanımlayabiliriz. $5200'ün anlamı 5 bitplane ($5000) ve composite renkli video sinyali (+$200) anlamına gelmekte. Bu register'daki diğer bitlerin anlamlarını, Doğan Türküler Hardware köşesinde diğer copper register'larıyla beraber açıklayacak. Biz şimdilik BPLCON0'ı bitplane adedimizi seçmek için kullanıyoruz. Örneğin 3 bitplane için buraya yazmamız gereken değer $3200 olmalıydı.

Bundan sonraki dört satır ile DIWSTRT ($008e), DIWSTOP ($0090), DDFSTRT ($0092) ve DDFSTOP ($0094) register'larına belli değerler yazıyoruz. Bu değerler yardımıyla ekran büyüklüğünü etkileyebiliriz. Örneğin DIWSTRT ve DIWSTOP ile oynayarak Overscan ekran yaratabiliriz. Bunu ilerde kullanacağımız için pek değinmiyorum. Yalnız verdiğim değerlerin normal bir 320*256 ekran yaratmak için kullanılan değerler olduğunu söylemeliyim.

$0108 ve $010a register'ları BPL1MOD (tek numaralı bitplane'ler için modulo) ve BPL2MOD (çift numaralı bitplane'ler için modulo) isimlerini taşımaktalar. Buraya yazacağımız değerler, bir sonraki satırın adresini bulmak için her ekran satırı sonunda ekran adresine eklenecek modulo değerlerini belirler. Verdiğim örnekte bitplane'ler hafızada alt alta yer aldığı için modulo değerleri 0 olmalıdır. Eğer bitplane'lerimiz özel bir amaç için yan yana dizilmişlerse, her iki modulo'yu da uygun değerlere ayarlamalıyız. İlerde blitter konusuna girdiğimizde hızdan kazanmak için bitplane'leri bu şekilde kullanacağız.

Copper listemizde bundan sonraki 10 satır ile bitplane adreslerini tanımlayabiliriz. $00e0 ve $00e2 (BPL1PTH ve BPL1PTL) ilk bitplane'in high ve low word'ünü taşır. Aynı şekilde diğer bitplane'ler tanımlandıktan sonra renkleri tanımlıyoruz. Bunun için renk register'larına istediğimiz renk değerini $0rgb olarak yazıyoruz, r, rengin kırmızı oranını, g ve b'de yeşil ve mavi oranlarını belirler. Renk register'ları $0180'den sonra gelen 32 word'dur (COLOR00-COLOR31). Verdiğim örnekte bütün renk register'larını sıfırladım. Programınızda resim ya da yazı kullanacağınız zaman, bunlara ait renkleri bu register'lara yazmalısınız.

Bundan sonra gelen satırlar sprite datalarının yerlerini tanımlamak için kullanılır. Fakat biz programımızda hiç sprite kullanmadığımızdan bunları da sıfırlıyoruz. Sprite kullanılacağı zaman, sprite'ın hafızada bulunduğu adresin üst ve alt word'ünü bu adreslere (SPRxPTH ve SPRxPTL) yazmalısınız. Sprite'lar hakkında şimdilik bir noktaya daha değineceğim. Mouse pointer'ı da bir sprite'dır. Sprite 0'ın adresini sıfırladığımız zaman sprite pointer'ı yok olacaktır. Bu yüzden programınızda mouse'u kapamak istiyorsanız sadece sprite 0 adreslerini 0 yapmanız yeter.

Şimdi dilerseniz programımızın kalan bir-iki ufak bilinmeyenini de açıklayalım. Programın Loop label'ından sonraki iki satırı, ekran tarama ışınının ekran sonuna gelip gelmediği kontrol edilir. Bunun için $dff006 register'ının içeriğine bakılır. Bu register'ın ismi VHPOSR'dir ve ekran tarama ışınının o anki konumunu gösterir. Eğer ekran tarama ışını 256. satıra (=$ff) geldiyse programımıza devam edilir. Aksi halde bekleme devam eder. Bu iki satırın amacı şu: Programlarımızda hareketli şeyler kullanmaya başlayınca bazen ekranda hareket eden kısımların titremeye başladıklarını görürsünüz. Bu, ekran tarama ışınının tüm hareketleri aynı anda gösteremeyeceğindendir. Bu durumda işlemlere başlamak için ekran tarama ışınının ekran sonuna varması beklenir. Bütün ekrandaki hareket işlemleri bu sayede ekran tarama ışını ekran dışında olduğu zamanlar yapılır. Ekran tarama ışınımız, ekranı 0. satırdan itibaren yeniden taramaya başladığı zaman da bütün değişen pikselleri update edecektir. Bu şekilde ekrandaki ufak tefek titremeleri de kaldırabiliriz. İlerde intro ve demo yazarken bu yöntemi umduğumuzdan da çok kullanacağız.

Mouse label'ından sonraki satırlarda $bfe001'in 6. bitini kontrol ediyoruz ve bu bit 0 ise programın çıkış rutinine geçiyoruz. Bu bit, mouse'un sol tuşunun konumunu gösterir. 6. bit 0 değerini taşıyorsa mouse'un sol tuşuna basıldı demektir. Mouse'un sol tuşuna basılmamış ise Loop label'ına geri dönülür. Devamlı tekrar edilmesini istediğimiz rutinleri bu yüzden Mouse label'ından hemen öncesine koymalıyız. Bu rutinler, mouse tuşuna basılana kadar tekrar edilir.

Hay allah, ne güzel tam öğrenmeye başlamışken yerimiz yine bitti. Programın başka açıklanacak yeri de kalmadı zaten. Gelecek ay, copper listesini kullanarak ufak bir rutin yazmaya ne dersiniz? Hem bu şekilde copper listesinin esas kullanılış şeklini de tam olarak görebilirsiniz. Hepinize bol byte'lı günler.

; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; >>>>GELISMIS ASSEMBLER - ÖRNEK PROGRAM <« ; >>> TEMEL RUTİN . <« ; >>> by :Cem GENCER /1992 <« ; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Q:

movem.l a0-a6/d0-d7,-(a7)

bsr.s Init

Loop:

cmp.b #Sff,$dff006 bne.s Loop

« Mouse:

btst #6,$bfe001 bne.s Loop beq.s Final

; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; >» Turn alt-rutinler buradan sonra ... <« ; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Final:

lea SysCop,a0 move.l (a0),50(a6) movem.l (a7)+,a0-a6/d0-d7 rts

Init:

move.l 4,a6 lea GfxName,a1 jsr -408(a6) move.l d0,GfxBase move.l GfxBase,a6

lea SysCop,a0 lea Copper.a1 move.l 50(a6),(a0) move.l al,50(a6)

rts

Klavyeyle gezinmek için ← ve → tuşları.