Bu sayfadaki yazılar
Sayfanın metni
Sayfa 40
TABLO 1 - Çeşitli library fonksiyonları
Fonksiyon ismi: DisplayAlert DisplayBeep MoveScreen Bulunduğu library: intuition.library intuition.library intuition.library Ofseti: -90 (-$5a) -96 (-$60) -162 (-$a2) Parametreleri: * giriş bilgileri: AlertNumber->d0; String->a0; Height->d1 Screen->a0 Screen->a0; dx->d0; dy->d1 * çıkış bilgileri: RECOVERABLE ALERT kullanıldığında sol mouse tuşuna basıldığında 0, sağ tuşa basıldığında -1. yok yok Fonksiyon ismi: MoveWindow ClearPointer PrintIText ScreenToFront Bulunduğu library: intuition.library intuition.library intuition.library intuition.library Ofseti: -168 (-$a8) -60 (-$3c) -216 (-$d8) -252 (-$fc) Parametreleri: * giriş bilgileri: Window->a0; dx->d0; dy->d1 Window->a0 RastPort->a0; Intuitext->a1 Screen->a0 * çıkış bilgileri: yok yok yok yok Fonksiyon ismi: ScreenToBack WindowToFront WindowToBack BltClear Bulunduğu library: intuition.library intuition.library intuition.library graphics.library Ofseti: -246 (-$f6) -312 (-$138) -306 (-$132) -300 (-$12c) Parametreleri: * giriş bilgileri: Window->a0 Window->a0 Window->a0 Memory->a1; Size->d0; Flags->d1 * çıkış bilgileri: yok yok yok yok
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 41
ASSEMBLER'da YENİ UFUKLAR
Merhaba arkadaşlar! Yine bir ay aradan sonra sizlerle birlikteyiz. Geçen ayki programdan sonra bu ay birkaç adım daha ileriye gidiyoruz. Umarım geçen ay bol alıştırma yapıp copper konusunu daha iyi kavrayabilmişsinizdir. Bu ay verdiğim program biraz daha karışık; o yüzden dilerseniz ilk önce hemen programı yazın. Bu program cursor tuşlarını kontrol eder ve bunlardan birine basılmışsa buna göre reaksiyon gösterir. Programı çalıştırdığınızda ok yukarı ya da ok aşağı tuşlarına basarsanız ekrandaki renk çubuğu, bastığınız tuşun yönünde hareket edecektir. Sağ ve sol ok tuşlarıyla da çubuğumuzun rengini değiştirebilirsiniz. Dilerseniz şimdi programa bir göz atalım. Ana rutinimize bir *bsr.s Key* satırı eklenmiş. Bu durumda program mouse'a basılıncaya kadar Key isimli alt-rutine zıplayacaktır. Key rutinine baktığımızda burada d0 register'ının içeriğinin silindiğini ve $bfec01 adresindeki bilginin byte olarak bu register'a aktarıldığını görüyoruz. Bu adres 8520-A çipinin Serial Data Register'ıdır. 8520-A çipi klavyeyi kontrol eden çip olduğundan bu adreste yazan değer de klavyeden direkt olarak gelen bilgidir. Bunun daha kısa tanımı, bu adreste klavyeye bastığımız tuşların kodlarının bu adrese aktarıldığıdır. Bu kodlar ASCII değildir. Bu yüzden istediğimiz bir tuşu algılamak için o tuşun kodunu bilmemiz gerek. Bunu da vermiş olduğum tablodaki tuş kodlarına bakarak bulabilirsiniz. $bfec01 adresinde tuşun her iki konumunu gösteren bilgiyi bulabilirsiniz. Tuş basıldığı anda bu adrese aktarılan sayı çifttir. Tuşu bıraktığınız anda ise bu sayı bir artacaktır. Bu şekilde hem tuşa basmayı, hem de bastıktan sonra tuşu bırakmayı dilerseniz ayrı ayrı algılatabilirsiniz. Programda verdiğimiz dört tuştan birine basılmamışsa tekrar ana rutine gidilerek mouse kontrolü yapılmakta, mouse'a basılmadığındaysa tekrar Key rutinimize dönülmektedir. Dört tuştan birine basıldığında ise gerekli alt-rutine geçmekteyiz. Bunları da şimdi sırayla açıklayacağım. Up rutininde Copper listesinde 52. byte ofsetinde bulunan word #$2007 ile karşılaştırılıyor. Eğer Copper listesindeki değer farklıysa MoveUp rutinine geçiliyor. Değer #$2007'ye eşitse bir üst rutine (ana rutine) dönülüyor. Aynı şekilde de Down rutini çalışmakta. Tek fark sadece #$2007 yerine #$e007 değerinin kontrol edilmesi. Sizin de anlamış olduğunuz gibi 52. ofsetteki değer copper listesinde renk çubuğu tanımlamasının koordinat tanımıdır. Bu durumda bizim yaptığımız işlem, copper çubuğunun ilk satırının koordinatını kontrol etmek ve ekran dışına taşıp taşmadığını algılamak. MoveUp rutininde a0'a renk çubukları tanımlamasının başlangıç adresini a0 register'ına kopyalıyoruz ve ufak bir loop ile 17 renk çubuğu tanımlama satırının pozisyon bilgisini #$0400 eksiltiyoruz. Bu şekilde renk çubuğumuz bir önceki duruma göre 4 ekran satırı yukarı kayacaktır. Aynı şekilde MoveDown rutini de renk çubuğunu 4'er satır aşağıya kaydırır. Şimdi de isterseniz sağ ve sol ok tuşlarına basınca neler olduğunu yakından inceleyelim. Sol ok tuşuna basıldığında ColorFwd, sağ ok tuşunda ise ColorRwd rutinine gidilir. Bu rutinlerde yapılan işlem gayet basit. ColNum değişkeninin 0 ile 4 arasında olması sağlanıldıktan sonra Fwd ya da Rwd rutinleriyle ColTab renk tablosundaki değerlerden bir kısmı copper listesinde renk çubuğu tanımlamamızın renk bilgisi word'larına kopyalanır. ColTab tablosuna dikkatli baktığımızda buradaki renklerin 16'şarlık 5 gruba ayrıldığını görebiliriz. Bu renk gruplarının sıralaması şöyle: kırmızı ($0x00), yeşil ($00x0), mavi ($000x), mor ($0x0x) ve sarı ($0xx0). Rutinimizde tuşa basıldığında ColNum değişkeninin içeriği değiştirilerek 32 ile çarpılmakta. 32 ile çarpmamızın sebebi her 16 renklik grubun 32 byte'lık yer işgal etmesi. Bu şekilde elde edeceğimiz değer ColNum değişkenine göre 16'lık renk gruplarından birini gösterecek. Basit bir loop yardımıyla da bu renk gruplarından birindeki değerleri copper listemize kopyalıyoruz. Bu yöntemle renk çubuğunun rengini değiştirebilirsiniz. Dilerseniz renk tablosunu genişletebilirsiniz. Bunun için ColorFwd rutinindeki 4 ile kontrol satırını da değiştirmelisiniz. Buraya yazacağınız değer renk tablosundaki grup adedinin bir eksiği olmalı. Bunun da nedeni 0 değerini de kullanmamız. 0 değeriyle ilk renk grubuna erişebiliriz. Daha değişik bir efekt yaratmak için her iki rutine de (Fwd ve Rwd) 'mulu #32,d0' yerine 'mulu #32,d0' yazmanız yeter. Bu efektin sebebini de artık siz anlamaya çalışın. Bu aylık da bu kadar. Gelecek ay yine renk çubuklarını kullanarak değişik bir efekt yaratacağız. Merak edenler zamanda bir ay ileriye yolculuk edip yeni dergiye bir göz atsınlar (!). Hepinize iyi çalışmalar dilerim. GELİŞMİŞ ASSEMBLER KURSU <<< ; >>> COPPER DEMONSTRASYON PROGRAMI 02 <<< :>>> by Cem GENÇER-1991 <<<
movem.l — a0-a6/d0-d7,-(a7) bsr.s Clear bsr.s Init Loop: cmp.b bne.s Loop bsr.s Key Mouse: btst #6,$bfe001 bne.s Loop beg.s Final
; Tum alt-rutinler buradan sonra ... <<< Final:
lea SysCop,a0 move.l (a0),50(a6) — (a7)4,a0-a6/d0-d7 Tts Init: move.l 4,26 lea GfxName,al jsr -408(a6) move.l d0,a6 move.l d0O,GfxBase lea SysCop,a0 lea Copper,al move.l move.l a1,50(a6) Tts Clear: lea $70000,a0