Bu sayfadaki yazılar
Sayfanın metni
Sayfa 36
Yine merhaba! Bu ay yine sizlerle beraberiz ve artık teorikten çok pratik konulara inmeye başlayacağız. Bakalım bu ayki menüde neler var? Geçen ay copper listesi kullanan bir program örneği vermiştim. Bu ay da copper'ın pratikte nasıl kullanıldığına değineceğim. İlk ele alacağım konu, çoğunuzun intro ve demolarda gördüğü renk çubukları (daha teknik bir terimle, copper çizgileri/çubukları). Bunların yapılışı gayet basit. Copper listemiz aracılığıyla ekran tarama ışınına belli bir satırda beklemesini ve bu satıra geldiğinde de zemin rengini değiştirmesini söylememiz gerekmekte. Bunu yapmak sandığınızdan da basit. Fakat ilk önce bir iki ufak değişikliğe dikkatinizi çekmek istiyorum. Bunlardan ilki copper listesini kullanış şeklimiz. Geçen ay makro kullandık, bu ay ise direkt dataları yazacağız. Bunun artı bir avantajı yok fakat Avrupa'da herkes bu yöntemi kullanıyor. Bu yönteme siz de kendinizi alıştırırsanız elinize geçen source'ları en ince ayrıntısına kadar rahatlıkla inceleyebilirsiniz. Tabii yine de tercih sizin. Dilerseniz yine de makro kullanın. Fakat şimdiden söyleyeyim, bütün yayınlayacağım source'larda copper listesi data tabloları şeklinde olacaktır.
Bu data tablosu şeklindeki source'u programımızda nasıl yaratacağız? Bu sorunun da cevabı basit. Geçen ay verdiğim makroları biraz dikkatli incelemişseniz bunların kullanıldıklarında hafızada data yarattığını görmüş olmanız gerekir. Tekrar hatırlatmak gerekirse üç copper komutunun parametreleriyle hafızadaki şekilleri aşağıdaki gibi olacaktır. CWAIT: dc.w yx, maske CMOVE: dc.w reg, data (reg 0 ile $1bf arasında olmalı) CEND: dc.w $ffff, $fffe
Her üç komut da gördüğünüz gibi word'lerle çalışır. Bunun nedeni Amiga'nın 16 bitlik bir bilgisayar oluşudur. Bütün adreslemeler 16 bit (1 word) üzerinden yapıldığında hiçbir sorun çıkmaz. Yukardaki üç komutta parametreleri nasıl vereceğimize bir göz atalım. İlk komut olan CWAIT'de yx word'ü ile beklenecek y ve x koordinatları verilir. Diğer word ise CWAIT komutunun bit dizilimindeki maskedir (VE ve HE-Vertical Enable ve Horizontal Enable). Bu maske genelde $fffe olur. Bu şekilde hem dikey, hem de yatay koordinatların dikkate alınacağını belirleriz. Şayet bunlardan herhangi birini kullanmak istemiyorsak maskede uygun bitleri 0 yaparız. Aşağıdaki örnekte olduğu gibi bu şekilde copper'ın, her 16. satırda beklemesini otomatik olarak gerçekleştirebiliriz. dc.w $4107, $fffe ; y=$41; x=07 koordinatını bekle. dc.w $0f07, $fffe ; her 16. satırda x=07 koordinatını bekle. Dikkat ettiyseniz bütün örneklerde yatay koordinat 07'yi bekletiyorum. Bunun nedeni, ekran tarama ışınının satır atlama noktasında oluşan ufak hatayı düzeltmek. Eğer x koordinatı olarak 07'den farklı bir değer yazarsanız ve monitörünüzün H.PHASE ayarı
6+yla ekranı sola doğru kaydırırsanız copper çizgisinin ekran sınırında kırıldığını (bir alt satıra geçtiğini) göreceksiniz. Tabii ki demolarımızda böyle ufak tefek hataları da istemiyoruz.
Yazımın ilk bölümünde anlatmadığım bir copper komutu daha var; CSKIP. Bu komutu anlatmayışımın sebebi biraz karışık oluşu ve pratikte hiçbir yerde kullanılmayışıdır. Şayet bu komutu kullanan bir source bulursanız bana da haber verin. Komutun bit dizilimi CWAIT ile hemen hemen aynı. Sadece $fffe yerine $ff01 yazıyoruz. Meraklılar için söyleyeyim, bu komutu daha detaylı olarak ilerde Hardware köşesinde bulabilirsiniz.
Gelelim bu ayki örneğimize. Örnekte data tablosu şeklinde copper listesi var. Bunu incelemenizi öneririm. Burada 1 bitplane açıyorum, gerekli tanımlamaları da yaptıktan sonra copper çubuklarımı yaratmak için CWAIT ve CMOVE komutlarını bir hayli kullanıyorum. Görebileceğiniz gibi üç temel grup var. Bunlardan herbiri
ASSEMBLER'da
YENİ UFUKLAR
yardımıyla kalınlıkları aynı, renkleri farklı olan üç copper çubuğu yaratılıyor. Her bir çubuğun hoş gözükmesi için de kendi içlerinde bir renk skalaları da var. Bu renk skalası, copper çubuklarına çok az da olsa şişkinlik efekti kazandırır.
Programın rutinlerine şöyle bir bakacak olursak, mouse kontrol rutininden hemen öncesine bir bsr komutu ek
Cem GENCER liyoruz. MODIFY alt-rutinine bir bak bakalım, neler var?
İlk satırda Copper'ın adresinin 52 byte ilerisini A0'a yüklüyoruz. Hayda, bunun ne gereği var? Copper listesi sadece word'lardan oluşuyor. Demek ki 52'yi 2'ye bölmemiz gerekli. Sonuç 26 olacak. Demek ki copper listesinin 26. word'ünün adresini A0'a koyuyoruz. Bir bakalım burada ne var? Copper listesinin başından itibaren 26 word sayarsak copper çubuklarının tanımlamalarının başına geliriz. Bizim rutinimizin de amacı buradaki datalarla bir şekilde oynamak. Sabırsız olanlar programı hemen yazıp çalıştırmışlarsa copper çubuklarının aşağıya doğru hareket ettiklerini görecekler. Sabırlı arkadaşlara da daha fazla beklemeden hemen programı yazıp çalıştırmalarını öneririm. Bu çubukları aşağıya doğru bir satır hareket ettirmek için yapacağınız tek şey program içerisinde copper çubuklarının koordinatlarıyla oynamak. Bunu döngü içerisinde yaparsanız devamlı aşağıya doğru bir hareket oluşur. Çubuklar ekran sonuna geldiklerinde de tekrar ekran tepesine geri dönerler. Bunun nedeni, dikey koordinat byte'ının $ff olduğunda ve tekrar satır ayırma döngüsüne gidildiğinde reset'lenerek 0 oluşundan kaynaklanıyor (-1'e 1 eklerseniz 0 olur, $ff'de bir anlamda -1).
Copper koordinatlarıyla oynarken dikkat edeceğiniz iki nokta var. Birincisi erişimlerinizi devamlı word olarak yapın. Longword kullandığınızda copper koordinat word'ünün yanındaki copper komut word'ünü de etkilersiniz. Bu da programınızda kötü sonuçlar doğurur (program çalışmaz!). Şayet byte olarak erişim yaparsanız ya sadece dikey koordinat byte'ını ya da yatay koordinat byte'ını etkileyebilirsiniz. Bu durumda en sağlıklısı yine de word. Rutinimizin MLP label'ından hemen sonra gelen satırın anlamını anlamışsınızdır herhalde. Dikey koordinata bir ekleniliyor. Bir sonraki satır A0'ın içeriğine 8 eklemekte. Bu da A0'ın bir sonraki copper koordinat bilgisine erişmesini sağlamakta. 24'lük (23+1 dbf komutu yüzünden) bir döngü yardımıyla da copper çubuklarının tüm dikey koordinatlarına bir eklemekteyiz. Bu şekilde her üç copper çubuğu da hemen hemen aynı anda bir alt satıra kayacaklardır.
Ana rutinimiz olan LOOP ile hem mouse ve VBLANK ($dff006) kontrol ediliyor hem de alt rutinimize dallanma yapılıyor. VBlank kontrolünün gerçek fonksiyonunu şimdi daha iyi görebiliriz. Loop label'ından sonra gelen iki satırın başına <;> işareti koyun ve programı çalıştırın bakalım, ne olacak? Program hızlı çalışır, fakat istemediğimiz bir hızda. Bu hızı da ancak VBlank'i kontrol ederek kontrol altına alabiliriz.
Evet bu aylık bu kadar. Sizden istediğim verdiğim programı kurcalamanız ve kendinize değişik copper'lar yaratmanız. Örneğin copper çubuklarının sayısını ya da kalınlıklarını değiştirin, bazı çubukları aşağı, bazılarını da yukarı hareket ettirin. Gelecek ay yatay copper'lara kısaca bir değinmek istiyorum. Diğer anla-
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 37
DİLLER
tacakları da şimdilik sürpriz. Gelecek aya kadar hoşçakalın ...
; >>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<< ; >> GELİŞMİŞ ASSEMBLER KURSU << ; >> COPPER DEMONSTRASYON PROGRAMI 01 << ; >> by Cem GENCER-1991 << ; >>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<< q
movem.l a0-a6/d0-d7,-(a7) bsr.s Clear bsr.s Init Loop:
cmp.b #$ff,$dff006 bne.s Loop bsr.s Modify Mouse:
btst #6,$bfe001 bne.s Loop beq.s Final ; >>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<< ; >>> Tum alt-rutinler buradan sonra ... <<< ; >>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<
lea SysCop,a0 move.l (a0),50(a6) movem.l (a7)+,a0-a6/d0-d7 rts Init:
move.l 4,a6 lea GfxName,al jsr -408(a6) move.l d0,a6 move.l d0,GfxBase lea SysCop.a0 lea Copper,al move.l 50(a6),(a0) move.l al,50(a6) rts
Clear:
lea $70000,a0 move.l #$a00,d7 CLP:
clr.l (a0)+ dbf d7,CLP rts
Modify:
lea Copper+52,a0 move.l #23,d7 MLP:
add.w #$0100,(a0) add.l #8,a0 dbf d7,MLP rts ; >>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<< ; >>> Tum datalar burada sonra ... <<< ; >>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<
GfxName:
dc.b 'graphics.library',0,0 Copper:
de. w $0100,$ 1200
de. w $008e,$3a81,$0090,$40cl dc.w $0092,$0038,$0094,$00d0 de. w $0108,$0000,$010a,$0000 dc.w $00e0,$0007,$00e2,$0000 dc.w $0180,$0000,$0182,$0000 dc.w $0120,$0000,$0122,$0000
dc.w $4O07,$fffe,$0180,$0300 dc.w $4107,$fffe,$0180,$0500 dc.w $4207,$fffe,$0180,50700 de. w $4307,$fffe,$0180,$0f00 dc.w $4407,$fffe,$0180,50700 de, w $4507,Sfffe,$0180,50500 dc.w S4607,5fffe,50180,50300 de. w $4707,Sfffe,50180,50000
de. w S5007,$fffe,50180,50030 dc.w 55107,$fffe,$0180,50050 dc.w S5207,5fffe,50180,50070 dc.vv 55307,$fffe,50180,500f0 de. w 55407,$fffe,50180,50070 dc.vv 55507,$fffe,50180,50050 dc.vv 55607,$fffe,50180,50030 dc.vv 55707,$fffe,50180,50000
dc.vv 56007,$fffe,50180,50003 dc.vv 56107,$fffe,50180,50005 dc.vv S6207,5fffe,50180,50007 dc.vv 56307,$fffe,S0180,5000f dc.vv S6407,$fffe,50180,50007 dc.vv 56507,$fffe,50180,50005 dc.vv $6607,Sfffe,50180,50003 dc.vv 56707,$fffe,$0180,50000
dc.vv 5ffff,$fffe
SysCop:
del 0
GfxBase:
del 0