DİLLER lamamız gerekli. Bu yüzden az yukardaki satırların başına bir de şu satırları eklemeliyiz: move.l GfxBase,a6 ; graphics.library başlangıci mo\e.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.libraıybaşı. 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'ina 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 adedimiz 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ı BPLİMOD (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 bdirler. Verdiğim örnekte bitplane'ler hafızada altalta yer aldığı için modulo değerleri 0 olmalıdır. Eğer bitplane'lerimiz özel bir amaç için yanyana 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'unu 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ıza bulunduğu adresin üst ve alt word'unu 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 O'ı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 bilinmeninin 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 o anki konumunu gösterir. Eğer ekran tarama ışını 256. satıra (=$ff) geldiyse progra- mı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 tüm hareketleri aynı anda gösteremeyeceğindendir. Bu durumda işlemlere başlamak için ekran tarama ışı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 itrbaren 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 $bfe()01'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 /<strong>19</strong>92 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Q: Loop: Mouse: movem.l a0-a6/d0-d7,-(a7) bsr.s Init cmp.b #Sff,$dff006 bne.s Loop btst #6,$bfe001 bne.s Loop beq.s Final ; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; >» Turn alt-rutinler buradan sonra ... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Final: Init: lea SysCop,a0 move.l (a0),50(a6) movem.l (a7)+,a0-a6/d0-d7 rts 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 « AMIGA DÜNYASI 38
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; >» Tum datalar buradan sonra ... >> ; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> GtxName: SysCop: GfxBase: Copper: dc.b dc.l 0 dc.l 0 'graphics.library',0,0 CMOVE CMOVE $5200,$0100 $3a81,$008e CMOVE $40cl,$0090 CMOVE $0038,$0092 CMOVE $00d0,$0094 CMOVE $0000,$0108 CMOVE $0000,$010a CMOVE $0000,$0132 CMOVE $0000,$0134 CMOVE $0000,$0136 CMOVE $0000,$0138 CMOVE $0000,$013a CMOVE $0000,$013c CMOVE $0000,$013e CEND CMOVE CMOVE CMOVE CMOVE CMOVE CMOVE CMOVE CMOVE CMOVE CMOVE $0007,$00e0 $0000,$00e2 $0007,$00e4 $2800,$00e6 $0007,$00e8 $5000,$00ea $0007,$00ec $7800,$00ee $0007,$00f0 $a000,$00f2 CMOVE $0000,$0180 CMOVE $0000,$0182 CMOVE $0000,$0184 CMOVE CMOVE $0000,$0186 $0000,$0188 CMOVE CMOVE $0000,$018a $0000,$018c CMOVE $0000,$018e CMOVE $0000,$0<strong>19</strong>0 CMOVE CMOVE $0000,$0<strong>19</strong>2 $0000,$0<strong>19</strong>4 CMOVE $0000,$0<strong>19</strong>6 CMOVE CMOVE $0000.$0<strong>19</strong>8 $0000,$0<strong>19</strong>a CMOVE CMOVE $0000,$0<strong>19</strong>c $0000,$0<strong>19</strong>e CMOVE $000a$01a0 CMOVE CMOVE $0000.$50la2 $0000,$01a4 CMOVE $0000,$01a6 CMOVE $0000,$01a8 CMOVE CMOVE $0000,$01aa $0000,$01ac CMOVE CMOVE $0000,$01ae $0000,$01b0 CMOVE $0000,$01b2 CMOVE $0000,$01b4 CMOVE $0000.$01b6 CMOVE $0000,$01b8 CMOVE CMOVE $0000,$01ba $0000,$01bc CMOVE $0000,$01be CMOVE CMOVE $0000,$0120 $0000,$0122 CMOVE $0000,$0124 CMOVE $0000,$0126 CMOVE CMOVE $0000,$0128 $0000,$012a CMOVE CMOVE $0000,$012c $0000,$012e CMOVE $0000,$0130 AMIGA DÜNYASI 39