AMIGA ASSEMBLER

Selam Assembler'kolikler! Çok sıcak ve nemli geçen yaz aylarından birinde yine sizlerleyiz. Umarım bu ay köşeme ayırabileceğiniz zaman biraz daha fazladır, zira bu ay, geçen ay kaldığım yerden devam edeceğim. — Anlatacaklarım bazılarınıza ağır gelebilir. Fakat hiç fark etmez: ne de olsa biraz ilerilerden bir konuya da değindik geçen ay: gadget'lara. Fakat geçen ayda belirttiğim gibi gadget'ları sadece üstünkörü anlatıyorum. Dileyenlerin kurcalamasını sağlamak için neyin ne olduğunu belirtmem gerekli diye düşündüm. Lafı fazla uzatmadan hemen açıklamamıza dönelim. Son olarak gadget tipini belirleyen word'un alabileceği değerleri listelemiştik. Bu word'un ikinci biti, gadget'ta resim kullanılırken set edilmeli. Bunu daha ilerki örneklerimizde de göreceğiz. Aynı word'daki üçüncü ve dördüncü bitler, gadget konumunun klikleme alanına relatif mi, yoksa kesin (absolut) mi olacağını belirlemek için faydalıdır. Bununla ilgili örnekleri de, gadget'ları daha detaylı açıklamaya başlayacağım zaman göstereceğim. Beş ve altıncı bitler, yine yatay ve dikey

Cem GENCER koordinat eksenlerinde relatifliği tanımlamak için kullanılır. Bu şekilde gadget'ların boyutlarını, window boyutlarına oranla olarak değişmesini bilirsiniz. Bunun için gerekli biti set etmeniz (Xİ) yeterli. Window'un boyutunu değiştirdiğimizde, gadget koordinat ve boyutları da değişerek pencere içindeki yerinin aynı kalmasını sağlar. Yedinci bit, window açılır açılmaz o gadget'ın gözükmesini sağlar. Bu çift konumlu (Yes/No) şalter için geçerlidir. Gadget'ı kullanılamaz hale getirmek içinse, sekizinci biti set etmeniz yeterli. Bu sayede o sekizinci bitin konumu reset (<0) edilinceye kadar seçilemez. Gadget structure'ı içindeki bir sonraki değerimiz, gadget klikleme özelliklerini belirten GADGET FLAG word'udur. Bu, bizim örneğimizde $201 değerini taşımakta. Şimdi isterseniz, bu her bir bitin anlamını size yine bir tablo olarak vereyim. Bu tabloya bakarak gerekli bitleri set konumuna getirirseniz, gelecekteki kliklemede dikkat edilecek kuralları belirleyebilirsiniz. Bit 0 - RELVERIFY: Sol mouse tuşu,

Mouse işaretçisi gadget klikleme bölgesi bırakıldığında gadget aktiflenmiş olur. Bit 1 - İşaretçisi, gadget klikleme bölgesi üzerindeyken sol mouse tuşuna basmanız gadget'ı aktif hale getirir. Bit 2 - ENDGADGET: Eğer gadget bir Requester ise, Requester klikten sonra olumsuz cevap seçilmiş gibi kapanır. Bit 3 - Kliklediğiniz andan, sol mouse tuşunu bıraktığınız ana kadar geçen zamanda eşit aralıklarla mouse koordinatları kontrol edilir. Bunu, klikten sonra sol tuşu bırakmadan gadget'in yerini de mouse'a bağlı olarak değiştirmek için kullanabilirsiniz. Bu da kullanıcıya daha yakın programlar demek... Bit 4 - RIGHTBORDER: Bu bit, sağ kenarın klikleme alanına tam olarak kurulması için kullanılır. Aynı şekilde aşağıdaki bitler de diğer kenarları uygunlaştırmak için kullanılır. Bit 5 - LEFTBORDER Bit 6 - TOPBORDER Bit 7 - BOTTOMBORDER Bit 8 - Bu bit yardımıyla her klikleyişte konum değiştirmesini sağlayabilirsiniz. (Çiftli şalter gadget). Bit 9 - STRINGCENTER: Bu bit set konumunda olduğunda, gadget'a ait text içinde ortalanarak basılır. Bit 0 konumunda ise, text sola dayalı olarak basılacaktır. Bit 10 - STRINGRIGHT: Bu bit ise, gadget text'inin sağa dayalı olarak gösterilmesini sağlar. Bit 11 - LONGINT: Bu bit yardımıyla bir string'i sadece sayısal giriş yapılmasına izin veren integer'a dönüştürebilirsiniz. Bit 12 - ALTKEYMAP: String gadget'ta başka bir klavye map'i kullanılacağını belirler. Bu bit açıklamalarına göre bizim gadget, STRINGCENTER ve RELVERIFY'a sahip. Gelelim gadget structure'ındaki bir sonraki değere; Bu word, tipi için kullanılır. İşte size burada kullanabileceğimiz bütün bitler ve anlamları: Bit 0 - BOOLGADGET: Bizim örnekte kullanılan boolean gadget adı verilen basit gadget'lar. Bit 1 - GADGET002 Bit 2 - STRGADGET: Yazı girişi yapmanızı sağlayan string gadget. Bit 3 - PROPGADGET: Bu iki bit de set edildiğinde, sürgü gadget'i (proportional gadget). Bundan sonraki bitler, sistem gadget'larını tanımlamak için kullanılır. Bit 4 - SIZING: Window boyut değiştirme. Bit 5 - Window için pozisyon değiştirme gadget'i. Bit 4 - Bit 5 - SCROLLING: Scroll için pozisyon değiştirme. Bit 6 - WUPFRONT: Window'u mevcut window'ların üzerine çıkaran gadget. Bit 6 - Bit 4 - SUPFRONT: Screen'i screen'lerin üzerine çıkaran. Bit 6 - Bit 5 - WDOWNBACK: Window'u diğer tüm pencerelerin arkasına almaya yarayan gadget. Bit 6 - Bit 4 - SDOWNBACK: Screen'i diğer tüm ekranların arkasına yarayan gadget. Bit 7 - CLOSE: Window'u kapamaya yarayan gadget. Bunlardan sonraki bitler de gadget'in global parametrelerini belirler. Bit 12 - Requester gadget'i. Bit 13 - GZZGADGET: Gimmezerozero window'u kullanıldığında, kenar gadget'i (ilerde detaylı olarak açıklanacak). Bit 14 - SCORGADGET: Set durumundaysa. Bit 15 - SYSGADGET: Set durumundaysa sistem. Bizim örneğimizde, bu word $1 değerini taşımaktaydı: öyleyse boolean gadget kullanıyoruz. Bundan sonra karşımıza bazı long-word'lar çıkıyor. Bunlardan ilki, gadget görüntü tanımlamasını içeren structure'ı gösteren bir adres göstergeci. Örneğimizde bu göstergeç, adresini göstermekte. Bu alt structure'a altta aşağıda bakacağız. Ardından gelen long-word, GADGHIMAGE flag'ı set konumundaysa kullanılabilir. Bu, az önce anlattığım adres göstergeci gibi yine bir gadget görüntü tanımlamasını içeren gadget'in adresini gösteren bir pointer. Eğer gadget'i kliklediğimizde, gadget görüntüsünün değişmesini istiyorsak, GADGHIMAGE bitini set etmemiz ve klik yapıldıktan sonra gösterilecek görüntünün structure'ının adresini gösteren bir pointer'ı da bu ikinci long-word'a yazmamız gerekli. Örneğimizde ikinci bir konuma gerek duyulmadığından, bu long-word 0 değerini taşımakta. Hemen sonraki long-word yine bir adres pointer'ı. Bu da gadget text'ini ihtiva eden gadgettext alt structure'unu göstermekte. Eğer hiçbir gadget text'i yoksa, buradaki değer 0 olmalıdır. Bizim örnekte bu long-word, REALLYITEXT alt structure'ini göstermekte. VAZ ve eksiklikler yüzünden hatalı olarak çalışır. Bu yüzden biz de örneğimizde bu özelliği kullanmayarak 0 değerini verdik. Ardından gelen long-word de 0 değerini taşımakta; çünkü bu long-word sadece string ve proportional gadget'larda kullanılır. Bu iki gadget tipi de biraz gelişmiş olduklarından ekstra bazı tanımlamalara ihtiyaç duyarlar. Bu tanımlamalar da SpecialInfo adlı ayrı bir structure'da toplanmalıdır. Fakat biz her iki gadget tipini de kullanmadığımızdan, bu long-word 0 değerinde. Gadget structure'ındaki bir alt satıra geçiyoruz. Burada bir word, 1 değerini taşımakta. Bu word'un ismi GADGETID. Bir pencerede birden fazla gadget'i birbirlerinden ayırt edebilmek için bu değeri kullanabiliriz. Zaten bizim örneğimizde de REALLY label'ından sonrasında gadget'in kodu aşağıdaki gibi kontrol ediliyor ve duruma göre uygun yerlere dallanma gerçekleştiriliyor.

$26(a4d),d0
cınp.w
REALLYEND
#2,dü 2 ise CLOSEREALI
: WİNDOW'a gn
bne.s WAİTREALLY de değilse başa dön

Gördüğünüz gibi, mesaj portu yardımıyla gadget

Bundan sonraki long-word yardımıyla, gadget kliklendiğinde diğer bazı gadget'ların da aktif ya da deaktif duruma geçmeleri sağlanılabilir. Bu yönteme İngilizce'de exclude (bağımlı)

KickStart 1.2 ve 1.3'lerde bu yöntem, sistem türlerindeki bazı ufak tefek ek-

Gadget ID kodunu al, yine REALLYEND'e kodu da aktarılmakta. Biz de bu tanımlama kodunu gadget tanımlama adresinin 38. ve 39. byte'larından meydana gelen word'den alabiliyoruz. EVENT rutininin en alttan üç ve dördüncü satırlarında mesaj portundan gadget'in tanımlama adresini bu-

İuyoruz:
move.l — ad
move.l

Eh, gadget structure'unun sonuna geldik. En sondaki long-word USER DATA'dır. Bunu şimdilik kullanmadığımızdan 0 değerini almakta. Gelelim gadget structure'ının alt kısmına. Kısaca tanıtmaya, ilk olarak GADGETTEXT adlı structure'ını inceleyelim. Örneğimizde gadgettext alt structure'ı REALITEXT altında yer almakta: REALITEXT:

deb 3,0,1.0
10,5

dc.l REALLYITEXTTEXTI: dc.b Evet, yine bilmediğimiz datalar ve pointer'lar. Hemen açıklamaya geçelim. İlk satırda 4 adet byte cinsinden sayı bulunmakta (3,0,1 ve 0). İlk iki byte olan 3 ve 0, kalem ve renkleri. Bunlar yardımıyla gadget text'imizin istediğimiz renkteki zemin üzerine istediğimiz renkle basılmasını sağlayabiliriz. 1 değerini taşıyan byte, yazının yazılış modunu tanımlamak için kullanılır. Aşağıdaki ufak tabloda kullanabileceğiniz değerler ve olan yazım modları vardır. Bunların detaylı açıklamasını ilerde göreceğiz.

Değer — Yazım modu 0 JAM1 1 JAM2 2 COMPLEMENT 4 INVERSID

İlk satırımızın en sonundaki 0 değeri, hiçbir anlam taşımaz; koymamızın sebebi, bilgisayarın hata etmesini engellemek. Biliyorsunuz, 68000 tek sayı bir adrese erişemez. Erişmeye kalkarsa da crash eder. Bunu engellemek için ya uygun yere bir dc.b 0 ya da bir EVEN komutu eklemek gerekir. EVEN komutu, Seka Assembler derleyicisine has bir komuttur. Görevi bir boş byte bırakarak komuttan sonra gelen komutları ya da dataları çift sayılı bir adrese yerleştirmesidir. Eğer zaten çift sayılı bir adresteyseniz, Seka bu komut yokmuş gibi davranacaktır. Zaten tek sayılı bir adrese erişmeye kalkıştığınızda Seka sizi uyarır ve hatanızı düzeltmenizi ister.

İkinci satırda yer alan iki word, yazımızın gadget içerisinde yerleştirileceği konumdur. Ardından gelen long-word, gadget içinde font kullanımı içindir. Sistem fontundan farklı bir fontla text'imizi içerisine yerleştirmek istiyorsak, buraya fontun adres pointer'ini yazmamız gerekli. Tabii ki bundan önce gerekli library rutinlerini kullanarak fontu açmamız ve disketten yüklemiş olmamız şart. Sıradaki adres pointer'ı hemen az aşağıdaki esas yazıyı göstermekte. En son long-word da bir adres pointer'i ve diğer bir text alt structure'ini tanımlamak için kullanılmakta. Gördüğünüz gibi burada da zincirleme bağlantı yöntemi hala kullanılmakta. Biz, başka bir yazıyı gadget içerisinde basmak istemediğimizden buraya 0 değeri giriyoruz. Fakat yazımız birkaç satırdan oluşuyorsa, bunların herbirini zincirleme yöntemiyle birbirine bağlamak gerekmekte. Sistem ancak bu şekilde diğer yazı satırlarını da görebilecektir. REALLYITEXTTEXTI label'ı ilk gadget'imizin text'ini tanımlamak için kullanılmakta. Gadget text'inin sonuna bitişi belirtmek için bir 0 değeri koymalıyız. Şayet 0 değerini eklediğimizde adres göstergecimiz tek sayılı bir adrese denk düşerse, ya bir 0 değeri daha ekleyin, ya EVEN komutunu ekleyin ya da tırnakların arasındaki yazının sonuna bir boşluk ekleyin. Bu üç yöntem sayesinde yine adres sayacını çift sayılı bir adrese getirmiş oluruz. GADGETTEXT da bittiğine göre, sıradaki diğer bir alt structure'a geçebiliriz: IMAGE. Bu alt structure yardımıyla gadget'imizin kenar çizgilerini tanımlayabilir ya da gadget'ımıza bir resim ekleyebiliriz. İkinci seçenek sayesinde hem programlarınız daha kolay anlaşılır, hem de görsel açıdan da zengin olacak. Bizim örneğimizde, Image REALLYGADGETIMAGE altında bulunmakta. Hemen bu label'dan sonra gelen satırlara bir göz atıyoruz: REALLYGADGETIMAGE: dc.w 2,1

REALLYGADGETIMAGE BORDERVECTORS'ü REALLYGADGETIMAGEBORDERVECTORS: 1,0,70,0,70,18,1,18,1,0 İlk satırdaki iki word, gadget görüntüsünü gadget değme bölgesi üzerinde yerleştirmek için kullanılır. Bu değerler yatay ve dikey koordinat eksenleri üzerinde + ve - olarak kayma miktarını belirler. Bu sayede gadget image'i, gadget değme bölgesi üzerinde istediğiniz yere koyabilirsiniz. Değerler orta nokta merkez alınmak şartıyla kayma piksel olarak belirler. Bundan sonraki iki değer (3 ve 0), çizim ve zemin renklerini tanımlamakta. Ardından gelen byte ise çizim modunu belirler. Bunun için gadgettext alt structure'indaki yazım modları tablosuna bakabilirsiniz. 5 değeri, kenarları tanımlayan 5 çift koordinatın olduğunu belirtmekte. Image structure'inin en alt satırındaki ilk long-word, kenar çizgilerinin koordinatlarını içeren tabloyu gösterir. İkinci long-word, varsa diğer bir image göstermek için kullanılmakta. Bu sayede istediğiniz bitplane sayısında (yine de maksimum 5) gadget görüntüsü yaratabilirsiniz. Gelelim kenar çizgilerini içeren tablomuza: GADGETBORDERVECTORS. Örneğimizde kenarı oluşturan 5 çift koordinat değeri var. Bunlardan ilk ikisi (1 ve 0) çizim kalemimizi yerleştirir. Daha sonraki koordinat çiftleri kalemin sırasıyla gideceği koordinatlardır. Kalem hareket ederken kenar çizgilerini çizecek ve bir dörtgen yaratacaktır. Tabii biz bu çizimi adım adım göremeyiz. Zira blitter bu çizgileri muhteşem bir hızla yaratmakta. Son iki koordinat çifti ise, tekrar başlangıç noktasına dönmemizi ve bu şekilde gadget'i kutuyu kapamamızı sağlar. Örnek programımızın en sonundaki DEPO değişkeni, zaman zaman a6 register'inin içeriğini saklamak için kullanılmakta. Eh, örnek programımızın açıklaması bu kadar. Zaten bize ayrılan sayfalar da burada dolmaya başladı. Artık bana da bir dahaki ay görüşmek üzere hoşçakalın demekten başka bir şey kalmıyor.