Amiga Dünyası sayı 14, sayfa 25

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 25

Merhaba Assemblercılar... Bu sayıda geçen sayıda verdiğimiz intuition text rutininin açıklamaları ile devam edeceğiz ve bu işlemi iyice öğreneceğiz. Text rutini açıklamaları ardından window'a intuition'ın verdiği özellikleri kazandıracağız.

Geçen sayıdaki programı çalıştırdığınızda, gördüğünüz gibi window'un sol üst köşesinde bir yazı bulunmaktaydı. Şimdi gelelim bu yazının nasıl oluştuğuna. İlk önce size programdan window'un içinde yazı yazımına ait makine kodu rutinini tek başına göstereyim.

1 move.l INTBASE,a6 2 move.l WINBASE,a0 3 move.l 50(a0),a0 4 move.l #TEXT,al 5 move.l #0,d0 6 move.l #0,dl 7 jsr -$d8(a6)

Şimdi, IntuiText rutininin açıklamasına geçelim.

Bu rutinin yaptığı işi gördünüz, Window içerisine yazı yazmaktan ibaret. Rutinin dört parametresi bulunmakta.

İlk parametresi, örneğin 2. satırında gördüğünüz gibi A0 registerine atanan WINDOW RASTPORT adresini içermektedir. Tabii bu rastport'un yazının yazılmasını istediğimiz window rastport'u olduğunu söylemeye gerek yok herhalde. Bu rastport'un nerede olduğuna gelince, o da window structure'ın 50. byte'ından itibaren bir longword değerde saklıdır. Bu uygulamayı 3. satırda görebilirsiniz.

İkinci parametre olarak, Text structure'ınızın adresini A1 registerine bildirmemiz gerekiyor (4. satır).

Üçüncü ve dördüncü parametre ise, yazılacak satırın X ve Y koordinatlarını içermelidir. Sizin isteğinize göre bu değer, window'un boyutlarını geçmemek şartı ile kullanılabilir.

IntuiText rutinin bir parçası olan text structure'ını aşağıda ayrı olarak tek tek açıklayalım.

TEXT: dc.b 3,2

dc.b 1 even

dew 2,10 del 0 del TEXTST del 0 dc.b 3,2

ÖMER SİNAN POLAT Bu iki byte değer yazımızın renklerini belirliyor. İlk değer yazının rengi, ikinci değer ise yazının arka plan rengi olmakta.

dc.b 1 Bu byte değer ise, ilk iki değer ile kombine bir halde. Görevi, yazının dört çeşit yazı modundan hangisi olacağına karar vermek. Bu değerler 0, 1, 2, 4 olabilir. 1 değeri, ilk satırda verdiğimiz iki değer aynen kullanılacak anlamına gelir. Burada 0 kullanırsak, sadece yazı rengi dikkate alınıyor ve 4 kullanırsak Text'imiz yazı renginin negatifi olarak beliriyor, even

Bu kullanım, Seka'ya aittir. Görevi, bir üst satırda tek byte kullanıldığından ve Seka'da kodu word değerler üzerinden oluşturduğundan oluşabilecek bir hatayı önlemek.

dc.w 2,10 Bu iki word değer rutindeki gibi yazı satırının X ve Y koordinatlarını belirtirler. Buraya yazdığınız değerler, rutindeki ile toplanıp sonuca göre yer tespiti yapılır. Ben burada 2 ve 10 değerlerini kullandım; nedeni, rutindeki X, Y koordinat değerlerine 0 girilse dahi yazı satırı window'un tam sol üst köşesine eşit gelecektir.

dc.l 0

Bu değer, herhangi bir karakter setinin pointer adresini içermelidir. Tabii bu karakter seti de yazının yazımında kullanılacak karakterleri belirtir. Eğer standart karakter setini kullanıyorsak, buraya 0 değeri girmeliyiz.

dc.l TEXTST İşte burada yazımızın bulunduğu hafıza adresini giriyoruz.

del 0

Bu adres 0 olduğunda, başka yazı çıkışı olmayacağı anlamına gelmektedir.

TEXTST: dc.b "IntuitionText",0

Bu satır, yukarıda da anlattığımız gibi yazılacak karakterleri içeriyor, dc.b formatında girdiğimiz bu kısa yazının son karakteri daima Null yani 0 olmalıdır.

Evet. Artık window içerisine yazı yazımını öğrenmiş bulunuyoruz.

Şimdi yeni bir örnekle yazı dizimize devam ediyoruz.

Bu arada dikkatinizi son iki örneğimizde de aynı olan bir şey çekmiştir. İki programda da programdan çıkmak için mouse'un sağ tuşunu kullandık. Acaba Workbench'teki window'larda olduğu gibi, window'u kapama kutucuğuna basarak bizim window'umuzu da kapatamaz mıyız?

Bunu biz de yapabiliriz. Tabii biraz karmaşık bir yapısı var. Şimdi örneğimizin bu halini görelim.

**** AMIGA DÜNYASI **** AMIGA INTUITION LIBRARY **** WINDOW EXAMPLE **** ASSEMBLER KURSU **** ÖRNEK 14.1

start: move.l 4,a6 lea INTNAME,al jsr -$228(a6) move.l d0,INTBASE beq EXIT3

move.l INTBASE,a6 lea WINDOW,a0 jsr -$cc(a6) move.l dO,WINBASE beq EXIT2

LOOP: move.l WINBASE,a0 move.l 86(a0),a0 move.l 4,a6 jsr -$174(a6) move.l d0.a0 move.l 20(a0),d6 tst.l d0 beq.s LOOP

cmp.l #$200,d6 bne.s LOOP

move.l 4,a6 move.l WINBASE,a0 move.l 86(a0),a0 move.l d0,al jsr -$16e(a6)

EXIT1: move.l,INTBASE,A6

move.l WINBASE,a0 jsr -$48(a6) EXIT2: move.l 4,a6

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