AMIGA ASSEMBLER

68000 KOMUTLARI

Motorola 68000 komutlarının hepsi hafızada ikişer byte yer kaplarlar. Buna ek olarak, çoğunlukla iki byte'tan tutun sekiz byte'a kadar komutların parametreleri olabilir. 68000'in komutları bir hafıza adresindeki sayıyı başka bir hafıza adresine taşımak, bir sayıyı bir register'e yüklemek, büyük hafıza bölgelerini başka yerlere taşımak gibi işlemleri yaparlar. Bunlara ek olarak BYTE'ların tüm bitlerini teker teker kullanmak ve basit aritmetik, lojik işlemler yapmak için de özel komutlar bulunur.

Makina dili komutları ile BASIC komutlarını karşılaştırdığımızda ise şöyle bir fark göze çarpıyor. Basic genellikle PRINT, LINE, DRAW gibi ekrana bir şeyler yazmak veya çizdirmek için komutlar içeriyor. Fakat Makina dilinde böyle belli bir işe göre programlanmış komutlar bulunmamaktadır. Bunlar yerine, daha doğrusu bir kısmının yerine, LIBRARY adını verdiğimiz Amiga sistem altrutinlerini kullanıyoruz. Makina dili programımızda kullanmak istediğimiz ve AMIGA LIBRARY (kütüphane)'sinde bulunmayan komutları biz kendimiz yazmak zorunda kalıyoruz. Tabii makina dilindeki bu komutlar BASIC'dekiler ile karşılaştırdığımızda çok büyük hız farkları ortaya çıkıyor, örneğin Basic'de yaptığınız program bir çizgi çizene kadar, makina dilindeki aynı program yüzlercesini rahatlıkla çizebilir. Bunun nedeni, BASIC'deki komutların işlevleri bir programa yönelik olmayıp, genel olarak bütün kullanımlara ayak uydurabilmesidir. Fakat makina dilinde biz, yazdığımız rutinleri sadece o program için yazacağız. Ve bilgisayar bunları hiçbir yorumlayıcıdan geçirmeyeceği için süratle çalışacaktır.

Makina dilindeki programlarımızda tabii ki 68000 haricindeki diğer ciplerin (grafik ve müzik için) kontrol register'lerine de erişeceğiz. Amiga'nın ROM (Read Only Memory - Sadece okuyabileceğimiz hafıza adresleri)'unda grafik işlemlerine yön veren FAT AGNUS cipinin register'lerine erişip istediğimiz grafikleri ekrana getireceğiz, çizgiler çizip, daireler, kareler yapıp, onların renklerini değiştireceğiz. Aynı şekilde Amiga'nın seslerini yaratan PAULA cipi register'lerine erişerek AMIGA'da mevcut 4 ses kanalını kontrol edeceğiz. İlk başta bu anlattıklarımız sizin için dağlar kadar yüksek gözükse de, bunların altında mükemmel bir basitlik yatmaktadır. Ve tam bir mantık. Makina dili programcısı mükemmel bir mantık anlayışı ve sabır sahibi olmalıdır. Tabii bu mükemmel ciplere söz geçirmek için ilk önce 68000 Makina Dili komutlarını öğrenmemiz gerekiyor.

68000'in komutlarını öğrenirken, her komutun genel olarak ne işe yaradığını anlatıp, ardından o komutun parametrelerini teker teker göreceğiz. Ve komutların parametrelerinin kullanımlarını daha da iyi anlamamız için hepsine uygulamalı birer örnek vereceğiz. Tabii zamanla, komutlarını öğrendikçe örnekler gelişip kısa rutinler ve daha da ilerledikçe kısa programlar haline dönüşeceklerdir.

Komutları öğrenirken, işlevlerini ilk okumada anlamayabilirsiniz. Böyle durumlarda verilen örnekleri ve yazıyı bir defa daha, yine olmazsa bir kez daha, yani anlayıncaya kadar okumanızı tavsiye ederim. Çünkü anlayamadığınız bir kısmı geçerseniz, daha sonraki örnek ve uygulamalarda birçok olayı kavrayamayabilirsiniz.

Şimdi komutların açıklamalarına geçelim, ilk olarak;

AMIGA ASSEMBLER

MOVE KOMUTU

Makina dilinde en çok kullanacağımız komutlardan birisidir. Görevini birkaç madde ile sıralayabiliriz.

A- Bir hafıza adresindeki sayıyı bir registere yüklemek

B- Bir hafıza adresindeki sayıyı başka bir hafıza adresine yüklemek

C- Bir registerdeki sayıyı bir hafıza adresine göndermek

D- Bir registerdeki sayıyı başka bir registere yüklemek

E- Bir adres registerindeki sayıyı Stack register, Program Counter'e göndermek

MOVE komutu yapı bakımından 6502 işlemcideki LDA ve STA komutlarına benzemektedir. Tabii MOVE kendi başına bu iki komutun yaptığı işi tek başına ve 4 katı büyüklükte yapabilmektedir.

Şimdi MOVE komutunun en çok kullanım moduna bir örnek verelim, örneğin 240 sayısını 327680 nolu hafıza adresine atamak istiyoruz. Bu işlem, BASIC'te POKE 240, 327680 ile yapılabilir. Aynı işlemi makina dilinde MOVE.B #$F0, $50000 ile yapabiliriz. Burada $F0 onaltılık sistemdedir ve onluk sayı sistemindeki 240 sayısını temsil ediyor. Aynı şekilde 327680 sayısı da, onaltılık sistemde $50000'e karşılık geliyor ve sayının konacak hafıza adresini gösteriyor. $F0'ın başındaki # işareti ise virgülden önceki sayının atanacak salt sayı olduğunu belirler. Eğer bu işareti koymasaydık (MOVE.B $F0, $50000 gibi) komutun parametresi tamamen değişecekti ve $F0 sayısı sayı olmaktan çıkıp bir hafıza adresini temsil edecekti ve bilgisayar da verdiğimiz komuta uyarak $F0 hafıza adresindeki sayıyı alıp $50000 hafıza adresine gönderecekti.

Örnekte MOVE komutunun hemen arkasındaki .B ibaresi ise, komutun BYTE modunda kullanılacağını belirler. Bundan başka .W ve .L olarak da kullanım modları mevcuttur. Bunların yardımı ile iki byte (WORD veya .W) ve dört byte (LONGWORD veya .L)'a aynı anda MOVE komutu ile kumanda edebiliriz, örneğin az önceki kullanımı MOVE.W $F0, $50000 olarak değiştirdiğimizde komut iki byte kullanımına geçiyor. Yani $F0'ı WORD olarak (iki byte = $00F0) olarak $00'ı $50000'e ve $F0'ı $50001'e göndermiş oluyoruz. Bu WORD kullanımını MOVE.W #$00F0, $50000 olarak yazarak daha açıklayıcı ifade etmiş oluruz, önemsiz gibi görünen bu iki sıfırın ileride programlamada çok büyük göz yanılmalarına neden olduğunu söyleyebilirim.

DERLEYİCİLER

Örneğimizi MOVE.L # S102004F0, S50000 olarak değiştirdiğimizde ise, adresleme şöyle olur: $10 sayısı $50000'e, $20 sayısı $50001 'e $04 sayısı $50002 ve $F0 ise $50003'e gider. Böylece 32 bit uzunluğundaki veriyi (1 LONGWORD = BYTE = 32 BİT) tek defada bir hafıza adresine göndermiş oluruz. Görüldüğu gibi AMIGA Makina Dilinde milyarlar ile ifade edilen sayıları depolamak veya başka bir yere göndermek son derece kolay.

Makina dili programımızda kullanmadığımız, fakat daha sonra kullanacağımız bir sayıyı MOVE komutu ile hafızada kendimiz için müsait gördüğümüz herhangi bir hafıza bölgesine saklayabiliriz. Yukarıda son kullandığımız örnekte olduğu gibi. Tabii bu komutun icrasından sonra, dört byte'dan oluşan veri S50000,den $50003'e kadar olan bölgede kendi halinde durur ve bilgisayar için hiçbir anlam ifade etmez. Ta ki biz onu oradan alıp yeniden kullanıncaya kadar.

MOVE komutu ile bir hafıza adresindeki sayıyı, başka bir hafıza bölgesine göndermek için komutun parametreleri şöyle olması gerekir: (MOVE.L $50000, S60000). Burada bilgisayara $50000'deki dört byte'ı alıp, $60000'den itibaren dört byte'a kopyala komutunu veriyoruz. Aynı şekilde LONGWORD olarak kullandığımız bu modu BYTE veya WORD I olarak da tek veya çift byte içinde uygulayabiliriz. Mod BYTE olduğu zaman (MOVE.B $50000, $60000)'de sadece S50000'deki sayıyı al ve $60000'e yerleştir demek oluyor. WORD'da ise $50000 ve $50001 'deki iki sayıyı al ve $60000 ve S60001'e yerleştir.

MOVE komutu hafıza adresindeki sayıyı bir data veya adres registerine göndermek için de kullanabiliriz. Örneğin; MOVE.B $5000, DO komutu ile, $50000'- deki bir byte'ı DO data registerine atamış oluruz. MOVE.B $50000, AO ile $50000'- deki bir byte'ı bu sefer bir adres registerine göndermiş oluruz. Aynı şekilde D0'den D7'ye kadar olan bütün data registerlerini ve A0'dan A6'ya kadar olan bütün adres registerlerini MOVE komutu ile kullanabiliriz.

MOVE komutunun bir başka kullanım modu ise, bir sayıyı bir adres veya data registerine göndermektir. MOVE.L

# $070000, D0 ile $070000 sayısını D0 data registerine ve MOVE.L # $070000, A0 ile aynı sayıyı A0 adres registerine göndeririz.

Programımız içinde belli bir döngüde veya bir rutinde çok kullanılan bir adresi, adres registeri üzerinden kullanmak hız ve anlaşırlık bakımından çok büyük kolaylıklar sağlayacaktır. Şimdi bunu ayrıntılı bir örnek ile daha iyi açıklayalım.

050000 : 207C 0007 0000 : MOVE.L# $0000,A0 
050006 :203C 0000 0032 : MOVE.L# $32,D0 
05000C : 2080 
: MOVE.L D0, (A0) 
05000E : 2210 
: MOVE.L (A0),D1 
050010 : 23C1 0006 0000 : MOVE.L Dİ ,$60000

işte bu beş satırlık makina dili programında hemen hemen bütün MOVE parametrelerini kullandık.

Birinci satırdaki komutta $70000 sayısını A0 adres registerine atadık.

İkinci komutta $32 sayısını D0 data registerine atadık.

Üçüncü komutta ise D0'daki sayıyı (kullanıma dikkat) A0 adres registerinin gösterdiği hafıza adresine gönderdik ($70000). Burada parantez içindeki adres registeri, sayının gidecek olan hafıza bölgesini temsil ediyor. Daha açıklayıcı olarak özetlersek: adres registerlerini kullanırken parantez içinde yazarsak, işlem adres registerinde bulunan adres rakamı ifadesine değil, adres registerinde bulunan adresin gösterdiği hafıza adresine yapılır.

Dördüncü komut da bu sefer AO'm ($70000) gösterdiği hafıza adresindeki sayıyı D1'e atıyoruz. Nihayet beşinci komutta ise Dl'deki sayıyı $60000'e gönderiyoruz.

Komutların başlarındaki sayıların ilk kolonda bulunanları bu beş satırlık makina dili programın yerleştiği hafıza adreslerini, ikinci kolondaki sayılar ise aynı kolondaki makina dili komutunun sayı olarak karşılığı ve ondan sonra gelen kolonlardaki sayılar ise aynı komutların parametrelerinin datalarını içeriyor.

Görüldüğü gibi sayıları ve adresleri,

MOVE komutundan kullanırken adres ve data registerlerinden kullanmak çok daha az yer kaplıyor (3. ve 4. satırdaki gibi). Tabii bir o kadar da program hızlanmış oluyor.

Move komutunun yukarıdaki kullanımlarından başka birkaç kullanım modu daha var. Bunları da sırası geldikçe bol bol örneklerle açıklayacağız. Başlangıç olarak bunları bilmeniz yeterli.

Bu arada bundan sonra vereceğimiz örnekleri Amiga'da hızı ve kolaylığı bakımından iki monitör ve Assembler derleyicisinde uygulayacağız.

1. C-MONITOR : Amiga'nın ilk monitör programlarından biridir ve CLI üzerinden çalıştığı için kullanımı son derece rahattır. Basit tek harfli komutlar yardımı ile AMIGA'nm hafıza adreslerine ve sistem rutinlerine en süratli şekilde ulaşıp, istediğimiz makina dili programını rahatlıkla kurcalayabiliriz (DE-BUG).

2. SEKA ASSEMBLER : Amiga'da Assembler program yazımı için yine en uygun ve hızlı program olarak Seka Assembler gösterilmektedir. Özellikle yeni başlayanlar için kullanımı çok rahat olan bu derleyiciyi, verdiğimiz bütün örnekleri girip, ardından sonucunu görmek için kullanacağız.

Şimdi yazımızın bundan sonraki kısmına, bu iki program ile beraber devam etmemiz gerekeceğinden en kısa zamanda eşten dosttan bunları edinmeye bakın.

Gelecek sayıda görüşmek üzere, başarılar.