AMIGA ASSEMBLER
Retro bilgisayarMerhaba assembler'cılar. Geçen sayımızda Seka üzerinden bir örnek vermiştik. Örnek programımız bir window açıyordu. Window Workbench ekranında açılıyordu. Şu anda sadece size ait ve kendinizce yaklaşık bir sayfalık bir yazım yaparak işte bu sonucu elde ettiniz. Tabii bunu söylerken bana kızanlar olabilir. Nasıl mı? Şöyle..
Bana kızacak olan arkadaşlarımızdan kastımız, geçen sayıdaki source text'ini defalarca yazıp da bir türlü çalıştıramayan arkadaşlar. Onlara öğüdüm böyle bir durumda hemen, bu olmuyor diye pes etmemeleri. Çünkü benim de yaptığım gibi sizin de bu gibi zorluklara sabırla ve gayet sakin yaklaşmanız gerekiyor. Bu anda yapmanız gereken şey, hata aramak olmalıdır. Bu olayda herkesin kendine göre bir tercihi olacaktır. Bazıları program text'ini defalarca kontrol edecektir. Veya compile işlemlerini kurcalayacaktır. Çok güzel. Zaten hata da böyle bulunurdu. Fakat sizden istediğim ve size önereceğim tek şey; bakış açınız. Seka'nın başındaki her insan, pardon düzeltme yapıyorum, her programcı klavyedeki hakimiyeti ile, source text üzerindeki yaptığı değişiklikler ile, system üzerindeki etkisi ile kendisini işlemciden bir parça olarak görmelidir. İşlemcinin, programcının yazdığı rutinleri üzerinde yaptığı işleri, programcının da aynen satırları yazarken kafasında biçimlendirmesi gerekir.
Şimdi programımızın açıklamasına geçelim.
Örnek rutinimizde (rutin demek biraz yanlış oluyor. Ona program dememiz daha doğru olur) öncekilerden farklı olarak AMIGA LIBRARY'leri gözükmekte.
Şimdi AMIGA LIBRARY'lerinden size biraz bahsedeyim.
AMIGA LIBRARY Kısaca AMIGA LIBRARY deyimi. Amiga'nın belleğinde bir yerde (bellekteki yerini daha sonra söylerim) duran, bilgisayarda sabit olup, bilgisayarı kapadığınızda dahi silinmeyen, ROM bellek diye adlandırdığımız yardımcı rutin niteliğinde makina kodu programlarıdır.
Pardon düzeltme yapıyorum. Amiga'yla ilgili bütün library'lerin hepsi hafızada sabit ROM bellekte bulunmuyor. Bir kısmını disketten yükleyebiliyoruz. Veya mega programcılar, mega programlarını hazırlarken daha önceden yapıp, birçok programına dahil ettikleri library'lerde bulunmaktadır.
Her Amiga System Library'sinde 2-100 arası rutin bulunmaktadır. Fakat bunda bir kısıtlama yoktur. Rutin sayısı istenildiği kadar çoğaltılabilir.
Tabii yararlarının sonsuz olduğunu söylememe bilmem gerek var mı? Normalde yazımı saatler ya da günler, aylar sürecek rutinleri, bu işin ustaları bizim için hazırlayıp ROM belleğe kaydetmişler. Ne güzeldir ki, bize sadece onları kullanmak kalıyor.
Bunların bir başka yapılış amacı ise programcıları fazla üzmemek. Amiga'nın yapısı olan sistem, workbench, intuition, disket işlemleri ve daha aklınıza gelen her şey hakkında fazla bilgisi olmayan programcıyı bunları öğrenmeye zorlayıp zaman ve beyin yorgunluğu kaybı vermeyip onları belli formatlar içerisinde topluca sistem üzerinde bir derece hakim hale getiriyorlar. Sözünü ettiğim derece; programcının, programına Amiga'nın ileri window, mouse, ekran, ses, multitasking, disk veya Workbench uygulamalarını kolayca dahil edebilmesi.
Mesela Amiga'nın mimarları zamanında bu rutinleri Amiga'nın belleğine koymasalardı diye bir düşünün. Bence o zaman bir felaket olurdu. Nasıl mı? Şöyle. Herkes Amiga'nın yukarıda bahsettiğimiz özelliklerinden yararlanabilmek için kendince bir sürü rutin yazardı. Örneğin biri bir başkasının programına bir göz gezdirdiğinde programın amacından çok program sisteminin tabanını oluşturan rutinleri algılamak için uğraşması gerekecekti. Şöyle durup sakince bir düşünüyorum da, böyle bir problem bu şekilden başka türlü herhalde halledilmezdi.
Bunların yanında, diyelim ki sizin yazmadığınız bir source'u inceliyorsunuz. Örneğin; program başladı. Bir ekran açıcı library rutinini çağıran bir kısım gördünüz. Demek ki ekran açılıyor. Arkasından aynı şekilde bir window uygulaması. Buraya kadar gelindiğinde geçen süre sadece birkaç saniye. Bu mükemmel bir olaydır. Rutinler, tanıdık sistem rutinleri olduğundan anlamak gayet basit. Böylece, programın ve gerçek anlamda programın özünü oluşturan kısımları yakalamak ve anlamak da çok basit bir hal alıyor.
Bu arada başka bir programcının programlarını incelemek sizin için çok büyük adımlar kaydetmek demektir. Fakat inceleyeceğiniz programı çok iyi seçmeniz gerekmektedir. Acemi bir programcının
AMIGA ASSEMBLER
programını incelemek, onu anlamaya çalışmak sizi fazlası ile yoracak ve makine kodu programlama bilginiz üzerinde ters uygulamalardan ötürü zedeleme yapacaktır. Ben bunu bizzat yaşadım. Daima en büyük hedefiniz, usta programcıların küçük programları olmalıdır. Usta programcıdan kastım, işin ehli ve uzun zamandan beri makine kodu çalışmasını yapan, Amiga library'lerini programlarına en iyi şekilde yerleştiren ve ortaya pozitif bir şeyler çıkarmış olanları kastediyorum. Acemi programcı dediklerim ise, program listesi kısa olan ve sadece bir işi yapmak ile görevli olan program yazanlar. İlerlemenin temel öğelerinden biri de budur. Zamanı geldiğinde hep beraber program incelemeleri yapacağız. Şimdilik bu konuda (DE-BUG) bu kadar bilgi yeter. Hatta fazla bile.
ÖMER SİNAN POLAT
Amiga library'leri Amiga'nın varoluşundan beri çok büyük değişikliklere uğramıştır. Programcılar devamlı hataları ve eksiklikleri gidermişlerdir.
Amiga'nın ROM belleğinde bulunan yani akım kesildiğinde silinmeyen library'leri şunlardır.
1- CLIST.LIBRARY: Bu library'deki rutinler Amiga'nın copper listesi üzerinde değişiklikler yapmak için gerekli olan kolaylığı sağlayan rutinleri içerir. Copper listesinin ne olduğunu şu anda sormayın. Çünkü onu anlatmam için daha öğrenmeniz gereken çok şeyler var. Size sadece copper'ın bilgisayarınızın grafik ile işlemlerini süper bir hız ile yapan bir devre olduğunu söyleyebilirim.
2- CONSOLE.LIBRARY: Bu library Amiga'nın Workbench sistemindeki console window'undan yazı çıkışı almak için kullanılır.
3- DOS.LIBRARY: Amiga'nın disk işlemleri için bu library'deki rutinleri kullanabilirsiniz. Bu library ile herhangi bir kayıt cihazından bir file silmek, ismini değiştirmek veya file flag'ları ile oynamak ya da file'ın comment bölümü ile kayıt zamanı değiştirme işlemlerini yapabilirsiniz.
4- EXEC.LIBRARY: Amiga'nızın library'lerinin babasıdır. Diğer library'leri kullanabilmek için de bu library'ye ihtiyacımız var. Neden mi? Çünkü diğer library'lerin açılmasında kullanılan OPEN LIBRARY adlı rutin burada bulunuyor. Bu arada exec library hafızada hazır bulunduğundan yüklemenize gerek yok.
Exec library bu işlerden başka hafıza tahsis etmek ve Amiga'nın input-output kanallarının çalışması ile ilgili rutinleri de içerir.
5- GRAPHICS.LIBRARY: Bu
library, blitter çipinin kontrol fonksiyonlarını içerir. Ayrıca grafik parçalarını kopyalama, dörtgen veya çizgi çizme, yazı yazma gibi basit grafik işlemlerini de yapan rutinleri ihtiva eder.
6- INTUITION.LIBRARY: Adından da anlaşıldığı gibi intuition rutinlerini içeriğinde bulundurur. Bu library sayesinde ekran açmak, window açmak veya Amiga menülerini kendi programımıza eklemek çok basit bir hal alır. Hatta son örneğimiz bunun bir uygulamasını içermektedir.
7- LAYERS.LIBRARY: Bu library ekran hafızaları ile ilgili işlemleri içeren rutinleri ihtiva eder.
8- MATHFFP.LIBRARY: Basit matematik değişkenleri işlemleri için rutinler mevcuttur.
9- POTGO.LIBRARY: Analog girişler için kullanılan bir library'dir.
10- TIMER.LIBRARY: Bu library kritik programların çalışması üzerine zamanlama işlemlerini içeren rutinleri ihtiva eder.
Amiga'nın normal Workbench disketinde bulunan ve istenildiğinde buradan yüklenen library'lerin listesi ise şöyle:
1- MATHTRANS.LIBRARY: Bu library'de yüksek seviyeli matematik fonksiyonlarını içeren rutinler mevcuttur.
2- DISKFONT.LIBRARY: Bilirsiniz; Amiga'nızın Workbench'inde kullanıldığı standart font, topaz.font'tur. Topaz.font dışında herhangi bir fontu kullanmak ve o font ile çalışmak istediğinizde, gereken rutinleri bu library içinde bulabilirsiniz.
3- ICON.LIBRARY: Bu library, Workbench sembolleri (icons) işlemleri için hazırlanmıştır.
4- MATHIEEEDOUBBAS.LIBRARY: Bu library integer sayılar için basit matematik fonksiyonlarını içerir.
5- TRANSLATOR.LIBRARY: Bu library Amiga'nızın konuşma chip'ine sizin verdiğiniz text'i okuması için gerekli convert işlemini içeren makine kodu rutinleri ihtiva eder.
Bunlardan başka, diğer Amiga programcılarının da yazdığı library'ler de bulunmaktadır. Bunlar genelde Workbench disketinde bulunmayıp kullanıldıkları programların kendi disketlerinde bulunurlar. Tabii bilmem söylemeye gerek var mı? Programın çalışması için o diskette bulunmaları gereklidir. Herkesin yazabileceği bu library'lerin hepsini bilemeyeceğimden şu ana kadar elime geçenleri size aktarayım.
1- ARP.LIBRARY: Arp.library, Workbench tabanlı programlarda kullanabileceğiniz ve programın file işlemleri ve diğer kısımlarındaki window ve options işlemlerine belli bir formata kolaylıklar getirmek üzere hazırlanmıştır.
2- REQ.LIBRARY: Requester library'de aynen Arp library gibi işlemler için yapılmıştır. Fakat yapı olarak Arp Lib.'den çok daha hızlı çalışmaktadır. Ayrıca özelliklerini karşılaştırdığımızda Requester library tercih edilmektedir.
3- IFF.LIBRARY: Adından da anlaşılacağı gibi IFF file'ları ve onların kayıt işlemleri ile alakalı rutinler içerir.
4- DIGITIZER.LIBRARY: Amiga'nın digitizer'larını kendi programlarımıza dahil etmek için gerekli olan rutinleri içeren bir library'dir.
Yukarıda kısaca ne işe yaradıklarını anlattığımız library'lerin yüzlerce rutin ve bunların açıklamalarını yapamayacağız. Fakat sizin konuyu öğrenebileceğiniz kadarını anlatacağım.
Tabii şu anda son örneğimiz doğrultusunda library açıklamalarımızı yönlendiriyoruz.
Library rutinleri hakkında bilinmesi gereken önemli hususlardan biri de, her rutinin bir veya birden çok parametresi bulunabildiğidir. Bu parametreler yardımı ile o rutinin yaptığı işe bir yön vermiş oluyoruz. Bu işleme BASIC'teki komut ve komutun parametreleri olarak benzetme yapmak en doğrusudur.
Mesela BASIC'te kullanılan LOCATE 10,20 komutunun ne anlama geldiğini hepimiz bilmekteyiz! Burada LOCATE, komutun ismi; 10 ile 20 ise komutun parametreleri olmaktadır. Aynı format makine dilinde library kullanımları içinde geçerlidir.
Bir library'yi kullanmak için ilk önce onu yüklemeniz gerekmektedir. Yükleme işlemi için EXEC.LIBRARY'yi kullanacağız.
Herhangi bir library'yi yükleme işlemini makine koduna şu şekilde çevirebiliriz.
MOVE.L4,A6
LEA INTNAME,A1
JSR -$228(A6)
INTNAME: dc.b "intuition.library",0
Evet görüldüğü gibi bu üç satır, son örneğimizin de ilk üç satırı ile aynıdır.
İlk satırdaki MOVE komutu Exec library'nin rutinlerinin hafıza adreslerini içeren tablonun başlangıcını verecektir.
İkinci satır Exec'deki OpenLibrary rutininin bir parametresidir. Yaptığı iş, açılacak library'nin isminin adresini A1 register'ına yazmak olmaktadır. Yukarıda INT-NAME bir label olmaktadır. Gösterdiği hafıza adresi ise intuition library yazısının başlangıcı olan yerdir. Burada dikkat edilmesi gerekli bir şey de isimden sonra 0 değeridir. Bu NULL (0) değeri ismin bittiği anlamına gelir.
Üçüncü satıra geldiğimizde, artık rutini çağırmanın zamanı gelmiştir. Exec library'deki OpenLibrary rutininin tablo adresi olan -$228 sayısını (A6)'nın içeriğine ekleyerek rutinin bulunduğu adrese atlanır. Ve işlem tamamlanınca bir alt satırdan itibaren program devam eder.
Window açıcı örneğimize şöyle bir bakınca tamamen library'lerden oluştuğunu göreceksiniz. Boşluklar ile aralanmış satırlar birer library uygulamalarını ifade etmektedir.
Kısaca programın gidiş hattını size açıklamak gerekirse;
İlk beş satır INTUITION.LIBRARY'yi açmaya ve onun rutin tablosunun adresini INTBASE label'lı hafıza adresine yazmaktan ibarettir.
6-10 arası satırlar WINDOW'u açmak için intuition library'den OpenWindow rutininin uygulanmasıdır.
11-12 arası satırlar Mouse'un sağ tuşunu beklemekle alakalıdır.
13-18 arası satırlar Window'u ve Intuition library'yi kapamakla görevlidir.
Diğer satırlar da yukarıda kullanılan üç rutinin diğer parametrelerini oluşturmaktadır. Bu satırları ayrıntılı olarak aşağıda anlatacağım.
Şimdi her zamanki gibi örneğimizin satır satır açıklamasını verelim.
Anlayış bakımından size programı oluşturan rutinleri tek tek bölmeden vereceğim.
start: move.l4,a6
lea INTNAME,al
jsr -$228(a6)
move.l d0,INTBASE
beq EXIT3
Programın ilk parçasında yaptığımız iş, intuition library'yi açmaktır. İlk satırdaki MOVE.L 4,A6 komutu, hafızada hazır olarak bekleyen Exec library'nin rutin tablo adresini A6 register'ına gönderiyor. Arkasından intuition library yazısının hafızada bulunduğu adresi A1'e gönderiyoruz. Jsr -$228(A6) ile rutin çağrılıyor. Ve bir alt satırdaki MOVE.L D0,INTBASE satırının önemi çok büyük olmakta. OpenLibrary rutininden çıktıktan sonra bilgisayar D0 register'ına intuition library'nin tablo adresini atayacaktır. Bu bölümün son satırı ise, eğer intuition library açılamazsa D0 register'ındaki değer 0 olacaktır. Böyle bir durumda olmayan library'den rutin çağıramayacağımız için bilgisayarı kilitlenmeden kurtarıp library açılmadan doğrudan programdan çıkmasını sağlarız.
Yazı dizimizi bu aylık noktalıyoruz. Gelecek sayı programımızın diğer satırlarının açıklamalarına devam edeceğiz.