Amiga Dünyası sayı 15, sayfa 41

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 41

Selam Assembler'cılar!.. Geçen ay hatırlarsanız intuition text rutinlerini açıklamış ve intuition'un window'lara kazandırdığı özelliklerden bazılarını incelemiştik. Bu ay ise geçen ay incelediğimiz message port'a biraz detaylı olarak bakacağız.

İsterseniz message port'un ne olduğunu kısaca izah edeyim. Amiga Intuition sistemini hazırlayanlar, sistemin herkese açık şekilde olmasına dikkat etmişler. Bunu da, exec ve intuition işletim sistemini parçalara ayırarak halletmişler. Bunun yararı, her bir parçanın gerektiğinde başına buyruk çalışabilmesi. Ama her biri gerektiğinde diğer birimlerden bilgi alabilmeli. Çünkü ne kadar birbirlerinden ayrı çalışsalar da, birbirlerini rahatsız etmemeleri gerekmekte. Bunu toplumda yaşayan insanlara benzetebiliriz. Her insan başkalarını rahatsız etmediği, onların haklarına tecavüz etmediği sürece özgürdür. Aynı şekilde intuition'da değişik işlemleri gören birimler de diğer birimlerin işlevlerini engellemedikleri sürece istediklerini yapabilmektedirler.

Her bir birimin bir diğerini rahatsız etmemesi için birbirleriyle belli bir şekilde komünikasyon sağlamaları gerekir. Birimler bu komünikasyonu da mesaj port'u adını verdiğimiz ayrı bir birim yardımıyla yapmaktadırlar. Bu mesaj port'unu da birçok sahibi olan bir posta kutusuna benzetebiliriz. Posta kutumuzun sahipleri intuition ve exec işletim sistemlerinin parçalarıdır. Bunların arasında klavye kontrolü, port kontrol birimi ve disk kontrol birimi gibi bir sürü birim var. Diğer bir birime mesaj göndermek isteyen birim, mesajını paketleyerek mesaj portuna bırakır. Tabii bu mesajın üzerinde kimden geldiği, kime gideceği ve boyutu da kayıtlıdır. En son olarak da mesajı gönderen birim mesaj port kontrol birimine bir mesaj bırakıldığını ve bunun kime gideceğini bildirir. Bu sayede her seferinde doğru mesajların doğru birimlere dağıtılması sağlanır. Mesaj artık yeni sahibini mesaj port'unda beklemektedir. Birimlerin her biri belli zaman aralıklarıyla posta kutusunu (mesaj portunu) kontrol ederek, kendilerine mesaj bırakılmış mı diye bakarlar. Kendilerine mesaj varsa hemen bunu alırlar ve mesaj portu kontrol birimine de kendilerine gönderilmiş olan mesajı aldıklarını belirtirler. Daha sonra da aldıkları mesajı gerektiği şekilde işlerler ve gönderen birime mesajın alındığına dair bir teşekkür notu (yine bir mesaj) gönderirler.

Nasıl, pek de zor değilmiş değil mi? Şimdi gelelim bu anlatılanları gerçekte oldukları gibi görmeye... Zaten işin en zevkli kısmı da bu.

ÖMER SİNAN POLAT

Bir mesajı nasıl göndereceğinizi bildikten sonra Amiga'nın exec ve intuition'u ile yapamayacağınız şeyler yoktur. Evet, tüm işlemler sonuçta mesaj portuna bağlıdır. Ancak bu şekilde işlemlerin hepsinin düzgün ve isteğe uygun olması sağlanır. Mesaj portuyla yapılabilecek işlemler arasında klavyeden harf okuma, disketten ya da diskete bilgi aktarımı, paralel ve seri portlar yardımıyla çift yönlü bilgi aktarımı vardır. Tabii bu örnekler, Amiga'nın kendisi kadar geniş ve sonsuz. Her işlem değişik bir sürü işlemin yapılmasını sağlamakta. Fakat biz artık o kadar derinlerini incelemeyeceğiz; zira öyle bir işe kalkışsak, yazı dizimiz daha en az 3-4 sene rahatlıkla uzayabilir.

Yukarıda da belirttiğim gibi artık mesaj portunu kullanmaya geçebiliriz. Bunun için listesini yayınladığımız programı girmeniz gerekmekte. Bu programın yaptığı, kısaca şöyle: Bir ekran, bunun üstünde de maksimum boyutlarda bir pencere açılır. Pencere kapama ikonunu kliklediğiniz zaman, yeni bir pencere çıkarak emin olup olmadığınızı sorar. Burada biraz daha güzel bir teknik kullanarak gadget kullandım. Gadget'ları daha ileride detaylı olarak göreceğiz; fakat merak edenler yine de aşağıdaki kısa açıklamalardan biraz da olsa bilgi kapabilirler. Umarım bu kadar bilgi hemen aklınızı karıştırmaz; zira gadget'lar Amiga Intuition'unun en önemli özelliklerinden biridir ve oldukça karışıktırlar. Bütün programın açıklanmasına isterseniz hemen geçelim:

Start label'ı ile başlayan satırlardaki işlemleri, herhalde artık hepiniz anlamışsınızdır, graphics ve intuition library'leri açılmaya çalışılmakta ve başarı elde edildiğinde programa devam edilmekte. Eğer bu iki library'den herhangi biri değişik bir neden yüzünden açılamazsa, otomatik olarak program bitiş kısmına (duruma göre EXIT2 ya da EXIT1 rutinleri) dallanarak açılan library varsa onları kapar ve programdan çıkar. Library'ler açıldığında bunların base adresleri (hafızadaki kopyalarının bulundukları adresleri) INTBASE ve GFX-BASE isimli iki değişkene kaydedilir. Daha sonra ne zaman bu library'lerden birini kullanmak istiyorsak, onun base adresini a6 register'ına atmamız yeterli olacak. Bu sayede her seferinde library'i açma zahmetinden de kurtuluruz. Ayrıca bir library üst üste açılmaya kalkışıldığında, her seferinde hafıza giderek azalacaktır, zira library'ler açıldıktan sonra kapanana ya da bilgisayar reset'lenene kadar hafızada yer kaplayacaklardır. Programımıza kaldığımız yerden devam edelim. Deminki teknikle screen ve window'umuz da açılmakta. Bu tekniği bundan sonra devamlı kullanmanızı tavsiye ederim. Ancak bu sayede programınızın %100 hatasız çalışacağından emin olabilirsiniz. Hata çıksa bile, bu library ya da screen açılamadı gibi basit bir hata olmaz. Assembler'a başlarken birçok arkadaşımın ve benim başımıza gelen en büyük sorun buydu. Uzun ve detaylı bir program hazırlarız ve bunu çalıştırmaya kalkıştığımızda hata çıkar ve aklımıza hemen en uğraştırıcı kısımlarda hata olduğu gelir. Oysa genelde hafıza dolduğundan (library kapama alışkanlığımız daha yoktu) yeni bir library ya da window açılamamakta ve bizi saatlerce uğraştırmaktaydı.

Screen ve window açıldıktan sonra, bir rast-port'u screen'e tanımlıyoruz. Window ve screen adreslerini de bu arada bir değişkene koymayı unutmuyoruz. Bu, bize programdan çıkışta window'u tekrar kapayabilmek için gerekli. Tabii yine bir hata olduğunda program bunu algılayacak ve duruma göre CLOSE 1 ya da CLOSE2 isimli alt rutinlere dallanacak. EVENTWAIT isimli rutin, tüm işlemimizi yapan kısım; burada devamlı window'un kapatma ikonu kontrol edilmektedir. İlk önce a6'daki adresi bir değişkene koyuyoruz. Ardından;

move.l windoprt,a0 satırı ile işlem kontrol rutini için ön hazırlığımızı yapıyoruz. Bu rutin yardımıyla, istediğimiz herhangi bir window'da önemli bir işlem gerçekleştirildi mi diye kontrol edebiliriz. Bunun için ilk önce window'umuzu gösteren pointer adresini, a0 register'ına atamamız gerekli. EVENT rutini, adresi verilen window'a ait bilgileri kontrol ederek bir işlem yapılıp yapılmadığını kontrol eder ve işlemin niteliğine göre bir değeri d4 değişkenine koyar. Biz de window pointer'ımızı a0'a yerleştirdikten sonra, 'bsr EVENT' satırı yardımıyla bir işlem gerçekleştirildi mi diye kontrol ediyoruz. Rutinden geri dönüşte DEPO değişkeninin içeriğini tekrar yerine, yani a6 register'ına koyuyoruz. Artık sırada d4 register'ının içeriğini kontrol etmek ve buna göre bir işlem yaratmak var.

AMIGA ASSEMBLER

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