AMIGA ASSEMBLER
Retro bilgisayarMerhaba Assembler'cılar. Tekrar bize ayrılan sayfalarda buluştuk. Hepimiz Assembler öğrenmek ve onu en iyi şekilde kullanmak istiyoruz. Tabii bu kolay bir iş değil. BASIC, Pascal veya C gibi yüksek seviyeli dilleri öğrenmek gibi Assembler'ı öğrenemiyorsunuz. Bu dilleri bilenler veya çok az bilgisi olanlar bile yazı dizimizi buraya gelene kadar olan kısmını izlerken, bunun farkına varmışlardır.
Assembler, çok ilginç bir kavramdır. Ben, onu sanki bir elektronik logic devreyi dizayn etmek gibi yorumluyorum. Tek tek assembler komutları ile elektronik parçalarının yaptıkları fonksiyonları kullanarak devreyi oluşturuyorsunuz. Bence aralarında çok az bir fark var. Her ikisinde de ortak olan AND, OR, NOT gibi kavramlar kullanılıyor.
Fakat yüksek seviyeli dilleri kullananlar bilirler. Bu dillerde kavramlar çok basite indirgenmiştir. Bir metin yazmak kadar kolay yazımları vardır; tabii dünya kadar kısıtlamaları ile beraber. Yüksek seviyeli diller ile çalışırken, istediğinizi tam anlamı ile yapmanız mümkün değildir. Programınızda ufak da olsa, "bu böyle değil de şöyle olsaydı" sorusunu kendinize soracaksınız. Yüksek seviyeli dillerde çalışırken programlarınızda hep başka birinin parmağı varmış gibi gelecektir. Komutların bazılarında hatalar veya eksik olan bir komut tespit edeceksiniz.
Ama makine dili deyince her şey bambaşka. Sizden üstün programcı yoktur. Kullandığınız komutlar diye bir şey yoktur. Sizi derleyici gibi şeyler de ilgilendirmez. Siz Motorola 68000'e doğrudan emir veriyorsunuz: "Şimdi yani bu anda bunu yapacaksın. Başka bir iş ile uğraşmayacaksın. Verdiğim emirler sırası ile yerine gelirken bütün sistemi ben yöneteceğim. Hiçbir şey benden izinsiz hareket etmeyecek, kıpırdamayacak bile".
Tabii bu işlem kolay olacak demiyorum. Zaten bunu da yazı dizimizi şimdiye kadar izleyenler anlamışlardır. Koskoca bir bilgisayar sistemini yönetmek, nerede ne var, nasıl kullanılır, ne işe yarar gibi binlerce soru ile karşı karşıyayız. Bu sistemi öğrenirken çok kafa patlattığımız ortada. Ama karşılığında aldığımız ödül ve çıktığımız seviye, bence tüm dünyanın hazinelerinden daha kıymetli bir şey. Makine dilini öğrenmek isteyen sizler de, bunu bir gün anlayacaksınız.
Şimdi 10. sayıda verdiğimiz örneğin son kısmını açıklayalım. Tabii ilk önce bu kısmı bir görün.
11
EXIT1: move.l WINBASE,a0
12
jsr
-$48(a6)
13
EXIT2: move.l 4,a6
14
move.l INTBASE,al
15
jsr
-$19e(a6)
16
EXIT3: rts
Label'ların adından da anlaşılacağı gibi, bu kısım programın çıkış kısmıdır. Fakat hemen kafalarda bazı sorular oluştuğunu görür gibiyim. Nedir bu üç tane EXIT isimli label? Yani üç tane çıkış noktası mı var?
Yukarıdaki satırlara daha dikkatli bakanlar Rts komutunun yalnız 16. satırda olduğunu görecekler. Tabii onların da kafasında, 3. kısımdan 4. kısma geçerken zaten sırası ile gidilip window ve intuition library kapatılıyor ve Rts'ye geliniyor. Peki buradaki anlam nedir?
Şimdi bu satırların açıklamasına geçelim ve 16. satırdaki Rts komutunun, bu program içindeki üç görevini görelim.
Aslında açıklamaların başlangıcı 4. kısımdan değil, 1. kısımdan başlıyor. Örneğimize baktığımızda 1. kısımda intuition library açıyorduk. İşte EXIT3 label'ı, yani Rts komutu intuition library açılamadığı durumlarda bilgisayarı kilitlenmeden kurtarıp programdan çıkılmasını sağlıyor. Diğer bir deyişle işlemcinin açılamayan intuition library'den intuition library rutinlerini çağırması yani kanunsuz bir iş yapması önleniyor. Bu Rts'nin ilk görevi.
İkinci görev için, programın 2. kısmına
AMIGA ASSEMBLER
bakmak yeterli. İşlemci buraya geldiğinde 1. kısımdan geçerken sizin verdiğiniz emirler doğrultusunda intuition library'yi hiçbir problem olmadan açmış ve 2. kısma gelip burada açılan intuition library'den Open window rutinini kullanmaya çalışıyor. Sistemin durumu window'u açmaya uygun değilse, EXIT2'ye ihtiyaç duyuldu demektir. Sistem window'u açamadığından, bizim de işlemcinin açılamayan bir window'da işlem yapmasını, yani programa devam etmesini engellememiz gerekir. İşte bunu da EXIT2 ile yapabiliriz. 13. satırdaki EXIT2'nin neden burada olduğuna dikkat edin. 2. kısımda window açılmadığında, EXIT3'den veya EXIT1'den çıksak olmaz mıydı? Olmazdı. Bildiğiniz gibi EXIT1 açılmış olan bir window'u kapamakla görevli. Arkasından EXIT2 geliyor ve onun da görevi intuition library kapamak. EXIT3 zaten ortada, hiçbir şey açmamışsak veya açamamışsak buradan programdan çıkış yapabiliriz.
ÖMER SİNAN POLAT
Tekrar programa dönelim. EXIT 1'den çıkış yapmanın sakıncası, buraya kadar geldiğimizde ortada herhangi bir window olmaması. Fakat intuition library açılmıştır. EXIT 1'den çıkış verdiğimizde, açılmamış olan bir window'a kapama işlemi yapacağız; ama zaten biz onu açamamıştık ki! İşlemciyi böyle yönlendirirsek, işlemci WINBASE pointerine 0 değeri koyacaktır. Ve işlemci 0 base'li bir window'u kapamaya zorlanacak. Ve büyük bir ihtimalle ya kilitlenecek ya da SEKA hata verecektir.
EXIT3'den çıkış yapıldığını düşünelim. Bu sefer de, programın başında açılmış olan intuition library'yi kapamamış oluyoruz. Açık olan library'miz hafızada gereksiz bir yer kaplamakta.
Programımızdaki rts komutunun üçüncü görevi, programın normal olarak çalışıp ve programın sona ermesini gerçekleştirmek.
Aslında bu programın çalışması esnasında, bilgisayarınızın intuition library'yi veya window'u açamaması gibi bir durum oluşmayacaktır. Neden mi? Çünkü Amiga'nın sistemi bu tür olaylarla çok az karşılaşıyor. Mesela bir library'nin açılamaması gibi bir durum yaratan etkenler o kadar az ki, makinanın bu duruma düşmesi çok küçük bir ihtimal.
Bir de window'un açılamaması durumunu ele alalım. Bir window'un açılamaması için, Chip Memory'de yeterli hafıza olmaması gerekir ki, window açılamasın. Tabii programımızda her iki durumun da oluşması ihtimalinin %1 olduğunu söyleyebilirim.
Gördüğünüz gibi, birkaç komuttan oluşan satırların açıklamaları ne kadar büyük ve kapsamlı.
Ve böylece 10. sayıda verdiğimiz örneğin açıklamalarını bitirmiş oluyoruz. Bundan sonraki açıklamalar ve aşağıdaki örnek programlar ile yazı dizimize devam edeceğiz.

************************************************
**** AMIGA DÜNYASI **** AMIGA INTUITION LIBRARY TEXT EXAMPLE **** ASSEMBLER KURSU ÖRNEK 13.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
d0,WINBASE
beq
EXIT2
move.l
INTBASE,a6
move.l
WINBASE,a0
move.l
50(a0),a0
move.l
#TEXT,al
move.l
#0,d0
move.l
#0,dl
jsr
-$d8(a6)
LOOP:
btst
#10,$dff016
bne
LOOP
EXIT1:
move.l
WINBASE,a0
jsr
-$48(a6)
EXIT2:
move.l
4,a6
move.l
INTBASE,al
jsr
-$19e(a6)
EXIT3: rts
* --------------------------------------------------------
INTNAME:
dc.b
"intuition.library",0
WINNAME:
dc.b
"Benim Window'um",0
TEXTST:
dc.b
"IntuitionText",0
TEXT:
dc.b
3,2
dc.b
1
even
dc.w
2,10
dc.l
0
dc.l
TEXTST
dc.l
0
WINDOW:
dc.w
20,20
dc.w
300,100
dc.b
0,1
dc.l
0
dc.l
$l+$2+$4+$8
dc.l
0,0
dc.l
WINNAME
dc.l
0,0
dc.w
200,50
dc.w
400,200
dc.w
1
INTBASE:
dc.l
0
WINBASE:
dc.l
0
********************************************
Yeni örneğimizin source listesine şöyle bir göz gezdirirseniz, eski örnek programa yaklaşık 15 satır kadar bir ek yapıldığını göreceksiniz.
Sonuçta dikkatinizi bu yeni satırlara yoğunlaştırdığınızda, bu satırların TEXT (yazı yazmak) ile alakalı olduğunu göreceksiniz.
Evet eski window açan programımıza burada bir yazım rutini eklemiş bulunuyoruz. Yani artık bir window'un içine istediğimiz yazıyı yazabileceğiz.
Şimdi siz SEKA'yı yükleyip yeni örneğimizi 10. sayıdaki gibi SEKA editör ekranına aktarmalısınız. Tabii 10. sayıdaki örneği herhangi bir yere (Buradaki herhangi bir yer deyimini disketler veya harddisk için kullanıyorum) kaydettiyseniz, onu tekrar SEKA editör ekranına yükleyip üzerine yeni satırları ekleyebilirsiniz. SEKA assembler derleyicisine herhangi bir source listesini yüklemek için, aşağıdaki şekilde hareket etmelisiniz.
1- İlk önce SEKA'yı hafızaya yükleyin. 2- Source listesini kaydettiğiniz disketi disk sürücüsüne takın.
3- Direkt modda iken, yani ESC tuşu ile editör moduna geçmeden, şu komutu vereceksiniz:
L df0:isim (RETURN tuşu) 4- Artık program yüklenmiştir. 5- ESC tuşu ile SEKA editör ekranına geçerek source listenizi görebilirsiniz. Ve bu source liste üzerinde istediğiniz değişiklikleri yapabilirsiniz.

Fakat 3. maddedeki komutu verdikten sonra SEKA bize file bulunamadı hatası verirse, doğru disketi koyup koymadığımızı kontrol etmemiz gerekir.
Eğer sürücüdeki disketin directory'sine bakmak isterseniz; SEKA'nın direkt komut modunda iken V df0: komutunu kullanıp disk sürücü 0'daki disketin directory'sine bakabiliriz. Tabii diğer 1., 2., 3.'nolu sürücülere bakmak için burada onun numarasını yazmanız gerekmektedir.
Sonuç itibarıyla, programı tamamen editöre geçirdikten sonra 10. sayıda anlatıldığı gibi compile işlemini gerçekleştirin. Eğer ortaya bir hata çıkarsa, o zaman yine 10. satırda hata tespit etme ve düzeltme önerilerimizi uygulayın.
Compile işlemini de bitirdikten sonra; programımız hazır demektir. Hemen JSTART komutunu direkt moddan vererek programı çalıştırın.
Her şey yolunda giderse, window'un sol üst köşesinde IntuitionText yazısını göreceksiniz.
Yazı dizimize bu aylık son veriyoruz. Gelecek sayıda bu işlemin açıklamasını yapacağız.
Hoşçakalın...