AMIGA ASSEMBLER

Merhaba Assembler'cılar. Geçen ay son örneğimizin ilk beş satırının açıklamasını yaparken, sayfalarımızı doldurmuştuk. Şimdi kaldığımız yerden yazı dizimize devam ediyoruz.

Programımızın dördüncü satırı olan MOVE.L D0,INTBASE'in önemini size biraz daha anlatmak istiyorum. Geçen sayıda da söylediğim gibi örneğimizin ilk beş satırının görevi Intuition Library'i açmak için idi. Dördüncü satırımızda Exec Library'den Open Library rutinini çağırdıktan sonra, ortaya çıkan Intuition Library'nin tablo adresini işlemci bize D0 data registerine göndererek ulaştırmaktadır. Tabii bize de onu oradan alıp hafızada herhangi bir yere kaydetmekten başka bir iş kalmıyor.

Bu adresi D0'dan alıp başka bir yere koymamızın amacı gayet basittir. D0 hem bizim için, hem de sistem için en çok kullanılan registerlerden biridir. Aynı zamanda onu hafızada kalıcı bir yere koyarak her zaman elimizin altında kullanıma hazır bir kıvamda bırakıyoruz. Örneğimizde olduğu gibi, INTBASE isimli label'ın gösterdiği hafıza adresine gönderiyoruz. Ne zaman Intuition Library'in ihtiyacını duyarsak hemen onu oradan alarak (Örneğin Move.L INTBASE,A6) library içinden istediğimiz rutinleri çağırırız.

Şimdi örneğimizin 6-10'nolu satırları ile açıklamalarımıza devam edelim.

6 
move. l   INTBASE.a6 
7 
lea 
WINDOW.a0 
8 
jsr 
-$cc(a6) 
9 
move.l  d0,WINBASE 
10  beq              EXIT2

Altıncı satırın içeriğinin ne olduğunu artık biliyorsunuz. Yine de açıklama gerekirse, INTBASE label'ı ile adlandırılmış adresteki longword değeri A6 registerine yolluyoruz.

Yedinci satır. Open Window rutininin tek parametresi olan structure'ı, structure hafıza adresinin rutine yerini bildirilmesidir.

Sekizinci satırda rutin çağrılıyor. Burada dikkat edilmesi gereken husus; bu satırda gördüğünüz gibi $cc değeri ile a6 adres registerindeki değeri topluyor ve işlemciyi bu sonucun gösterdiği yere dallandırıyoruz. Tabii altıncı satırda a6'ya intuition library tablo adresini gönderdiğimizden, bu değer ile $cc'nin toplamı da Intuition Library'nin Open Window'una karşılık geliyor.

ÖMER SİNAN POLAT Dokuzuncu satırda ise rutin çıkışında oluşan window'un window durum bilgilerini tablo'nun adresini WINBASE isimli label'ın gösterdiği hafıza adresine gönderiyoruz. Tabii window'umuzu açarken herhangi bir problemler ile karşılaşabiliriz. Mesela yeterli hafıza olmayabilir. Bu gibi durumlarda window açılamadığından sistem bize bu durumu burada D0 registerine 0 değeri koyarak belirtir. Bizde 10. satırdaki çıkış satırı ile bu gibi tehlikeli durumlardan programı korumuş oluruz. Buradaki koruma kelimesi, açılamayan bir window'u kapatmaya çalışmamaktır (EXIT'de olduğu gibi). Bu gibi durumlarda mesela bilgisayarınız kilitlenebilir veya başka aksaklıklar görülebilir.

Buraya kadar anlattığımız kısım örneğimizin açılış için gerekli olan kısmı olarak yorumlayabiliriz.

Evet... Yukarıda Intuition Library açmıştık. Arkasından da bir rutin çağırdık. Rutinin ismi: Open Window. Tabii ki bu rutin Intuition Library'ye ait. Daha önce de size söylediğim gibi, her Library rutinin parametreleri vardır. Bu rutinin de parametreleri şöyledir:

Rutin çağrılmadan önce yapılması gereken işlere geçmeden önce; size Library'lerle ilgili bir sistem kullanımını daha anlatmam gerekiyor. Bazı library rutinleri işledikleri değerleri bizden sistem registerleri yerine, structure diye adlandırdığımız tablolar aracılığı ile almak isterler. Bu tablolarda biz, bir dizi sayısal veya text değerler ile rutine bir dizi bildiride bulunuruz ve o da bu tablodaki değerleri okuyup, bizim verdiğimiz formatlarda söz konusu işlemi yapar.

İşte Open Window rutini de böyle kullanımı olan bir rutin. Onun da bir structure'ı var. Ve biz de söz konusu window'un en ufak ayrıntısına kadar her şeyi bu tabloya yazıyoruz. Sonrasını hiç düşünmeyin Open Window rutini sağ olsun, her şeyi hallediyor. Bir de bakıyorsunuz window karşınızda belirmiş.

Şimdi size Open Window structure’ında neler bulunduğunu anlatacağım. Örnek programımızda WINDOW label adı altında olduğu gibi bir window structure'ı 48 byte'dan oluşan bir data satırından ibarettir.

Bu 48 byte, bu data satırlarında kimi zaman word kullanımlı ve kimi zaman byte ve longword kullanımlı bir format taşır ve data bölgesinin aynı adlı yerinde aynı uzunluk için bir anlam ifade etmektedir. WINDOW: dc.w 20,20

dc.w    300,100 
dc.b    0,1 
del     0 
del     $l+$2+$4+$8 
del      0,0 
del     WINNAME 
del     0,0 
dc.w   200,50 
dc.w   400,200 
dc.w    1
WINNAME: dc.b "Benim Window'unV'.O

Şimdi Byte Byte structure satırları açıklayalım.

dc.w 20,20 ilk iki word açılacak window'un sol üst köşesinin koordinatlarını oluşturmaktadır, dc.w 300,100 üçüncü ve dördüncü word ise söz konu-

AMIGA ASSEMBLER

şu Window'umuzun boyutlarını ifade etmektedir. Üçüncü word window'un enini ve dördüncü word boyunu temsil eder.

dc.b 0,1 Bunların arkasından iki byte sırası ile window'un zemin ve çizgi renklerini ifade eder.

dc.l      0

Bundan sonra gelen Long word değer ise sistemin, örneğimizdeki window için IDCMP flaglarının kontrolünü gerçekleştiren bir sayıdır. Bu flaglar yardımı ile window'umuzun bir sürü özelliklerinden yararlanabiliriz. Bilirsiniz; mesela Amiga Workbench sisteminde herhangi bir window açtıktan sonra sol üst köşedeki kutucuk (window close symbol) yardımı ile kapatabiliriz. Ve bizim bu örnek programımızın window'unda da kapama sembolü var. Fakat sol tuş ile bu sembole ne kadar basarsanız basın kapatamazsınız. Yani söylemek istediğim bu gibi işlemleri programınızda, ufak rutincikleri oluşturarak gerçekleştiriyoruz. Nasıl mı? Aşağıda anlatacağım gibi.

En basitinden window kapama işlemini de; bu flaglar vasıtası ile yapacağız. Window structure'ındaki IDCMP flaglarına yazacağımız sayılar ile window kapama, boyut değiştirme, gadget aktif hale gelimi, Window'a bağlı bir menü seçimi gibi window aktiviteleri kontrol edilebilir. Bunlara ek olarak window aktif halde iken bir tuşa basılı olup olmadığı veya sürücülerde disket sokup çıkarılması gibi durumları da işlenebilir.

IDCMP flaglarının geniş bir açıklamasını yapmak, size tam anlamı ile bu olayı en derin noktasına kadar açıklamak isterdim. Fakat genel olarak assembler yazı dizimizdeki akışı yavaşlatmamak ve bir konuda takılı kalıp diğer bilgilerinizi zedelemek istemiyorum. Şimdilik bu kadar bilgi yeterli olacaktır. Şu andaki örneğin açıklaması bitiminde IDCMP flaglarının programa eklenmesi üzerine bir ek yapacağız. Şimdilik bu örnekte gördüğünüz gibi window'u mouse'un sağ tuşunu kendi adresinden bekleterek kapatıyoruz.

Bu örnekte IDCMP flaglarını kullanmadığımız için buradaki long word değere 0 değeri yazmamız yeterlidir.

dc.l $1+$2+$4+$8 IDCMP flagları longword'u ardından window'umuzun özelliklerini belirteceğimiz longword'a sıra geliyor. Buradaki longword'a yazımızın sonundaki tabloda bulunan rakamları yazarak, window'un intuition'ın verdiği özellikleri kazandırabiliriz. Kullanım açısından birinci sınıfa giren flagları karşısına açıklamalarını yapacağız.

dc.l 0,0 Buradaki ilk longword window'un içinde gadget bulunup bulunmadığını belirler. Buraya; tabii eğer window'da gadget varsa, ilk gadget'ın structure adresini yazarız. Şu anda sizin bu konuda bilginiz olmadığını düşünerek ve şimdilik bu longword'dan bu kadar şey bilmeniz yeterlidir.

dc.l WINNAME Eğlenceli bir satır olarak görülebilir. Window'umuzun isminin bulunduğu adresi buraya yazacağız. Örnekte bir WIN-NAME label'ını kullandık. Anlamı, örnekte buradan beş satır aşağıdaki data satırıdır. Orada WINNAME isimli label'ın karşısında text olarak window'un ismi durmaktadır. Structure'da isim tanımlama kısmı; aynen böyle olmalıdır. Başka bir kullanım şekli yoktur.

dc.l 0,0 Bu satırdaki ilk longword; window'un ekran structure pointer'ının adresini girmek içindir. Eğer window'u yeni bir ekranda değil de o an kullanılan ekranda açıyorsanız, yani bu ekran çoğunlukla standart Workbench ekranı olur; bu longword değeri 0 girilmelidir. Ya da yeni bir ekran açılmış ise, o ekranın programınızdaki structure adresini girmelisiniz.

Buradaki ikinci longword ise window yeni bir ekranda açılmış ise söz konusu ekranın bitmap adresinin buraya girilmesi gerekir.

dc.w       200,50 
dc.w       400,200 
Bu 
dört 
word 
modunda 
değer 
window'un bulunduğu ekrandaki maksi- 
mum ve minimum hareket koordinatlarını 
oluşturmaktadır.
dc.w        1

Bu word değer ise ekran tipini belirler.

WINNAME: dc.b "Benim Window'um",0

Bu satır window structure'ı içerisinde ekran isminin tanımlamasının bir kısmıdır.

11 LOOP: btst #10,$dff016 12 bne LOOP 11. ve 12. satırlarda, mouse'un sağ düğmesine basılıp basılmadığını kontrol ettiriyoruz. 12. satırda, eğer bu düğmeye basılmamışsa, işlemciyi tekrar kontrol et anlamında bir üst satıra yönlendiriyoruz.

Görüldüğü gibi, işlemciye bu satırlara gelene kadar iki ana iş yaptırdık. İlk olarak intuition library'yi açtık, ikinci iş olarak, intuition library'yi kullanarak bir window açtık. Ve tabii son olarak anlattığımız kısım, basit bir bekleme döngüsüdür.

Onbirinci satırdaki $dff016 adresi, Copper listesi içinde olup word olarak hesaplarsak onuncu biti ya da byte olarak hesaplarsak $dff017 adresinin sıfır nolu bit'i mouse'un sağ tuşunun basılı olup olmamasına denk gelmektedir. Eğer bu adresin bu bit'inde 0 değeri varsa bu tuş basılı ve 1 değeri varsa tuş basılı değil anlamına geliyor.

Örneğin üçüncü kısmının ne anlama geldiğini anladığınızı tahmin ediyorum. Bu kısım programın ana parçasını oluşturmaktadır. Tabii bu kısa örneğin ana teması, sadece bir window'u açmak olduğundan, örneğin ana parçasını sadece window açıldıktan sonraki bekleme döngüsü oluşturmakta.

Böylece örneğimizin başlangıç ve ana kısımlarını anlatmış bulunmaktayım. Anlatımlarımızın bu kadar uzun sürmesi; yani 20 satırlık programı üç sayıda anlatmamızın sebebi, yazı dizimizin ilk örneğimizi anlatırken kafanızda en küçük bir soru bile kalmamasını sağlamaya çalışıyorum. Örnekleri incelerken tek bir satırı bile yeterince iyi kavrayamamanız, ileride aynı tür kullanımları da anlayamamanıza sebep olabilir. Ayrıca size en önemli tavsiyem, yazı dizisinin bir kısmını okuyup da anlayamadığınız bir durumda, sabırlı olup anlayana kadar defalarca tekrar etmenizdir. Bu işlemde hiçbir gariplik yoktur ve bence bunu başka türlü halletmeniz mümkün değildir.

Defalarca okuyup, yine anlayamadığınız kısımlar olursa, sorularınızı dergimiz adresine assembler kursu adı altında yazabilirsiniz. Mektuplarınızı size geri gönderebilmem için pul koymayı ihmal etmeyin.

Yazı dizimize bu aylık son veriyoruz. Gelecek sayıda örneğimizin anlatımını bitireceğiz.

Şimdilik hoşçakalın.

Bit Değer Anlamı 0 $0000001 WINDOWSIZING WINDOW'UN BOYUTLARI DEĞİŞEBİLİR 1 $0000002 WINDOWDRAG WINDOW EKRANDA HAREKET EDEBİLİR 2 $0000004 WINDOWDEPTH WINDOW ÖNE VE ARKAYA GİDEBİLİR S0000010 SIZEBRIGHT WINDOW'A BİR MESAJ GELİNCE REFRESH

4 $0000020 SIZEBOTTOM 5 $0000040 SIMPLE REFRFSH 6 $0000080 SUPER BITMAP 7 SOOOOIOO BACKDROP WINDOW EKRANDA EN ARKADA KALIR 8 $0000200 REPORTMOUSE 9 $0000400 GIMMFZFROZFRO 10 $0000800 BORDERLESS ÇERÇEVESİZ WINDOW 11 SOOOIOOO ACTIVATE WINDOW İLK AÇILDIĞINDA AKTİF 12 $0002000 WINDOWACTIVE WINDOW AKTİF 13 $0004000 IN REQUEST 14 $0008000 MENUSTATE 15 S001()()()() RMBTRAP WINDOW'UN MENÜSÜ YOK 16 $0020000 NOCAREREFRESH REFRESH MESAJI VERİLMEMESİ

24 $1000000 W1NDOWREFRFSH 25 $2000000 WBENCHWINDOW