Amiga Dünyası sayı 26, sayfa 16

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 16

Bu ayki yazımızın konusu, Amiga C'de Assembler alt rutinlerinin kullanımı. Assembler bildiğiniz gibi bilgisayarın en temel dili olarak kullanılıyor. Assembler programları araya hiçbir yorumlayıcı girmediğinden çok hızlı çalışabiliyor. Hız her programcının istediği bir özellik. Bu nedenle özellikle oyunlar assembler dili ile yazılmakta. Assembler dilini diğer dillerden ayıran en büyük özellik; sisteme direkt olarak ulaşabilmek. Örneğin Amiga'nın blitter çipine ulaşmak, assembler dili ile oldukça kolay. Bu sayede de sistemi tam performans çalıştırabiliyorsunuz. Hızlı scroll'lar, kayan yazılar, vektör hesapları ve çizimleri bu tür bir yazılım gerektiriyor.

Amiga C'de yazılan programların hemen hepsi sistem komutlarını kullanır. Bu komutlar Library dediğimiz kütüphanelerde bulunuyor. Bildiğiniz gibi kullanılan Library'ler genellikle 'graphics.library', 'intuition.library', 'dos.library' ve diğerleridir. Eğer biz bu library'leri kullanmadan program yazmak istersek, işte o zaman sisteme direkt olarak ulaşıp işimizi görmeliyiz. Tabii bu iş için de Amiga sistemini ve yapısını iyi tanımamız gerekmektedir. Örneğin açmış olduğumuz iki ekrandan birindeki resmi diğer ekrana taşımak istiyoruz. Bu işi Amiga C'de yaparken bir blitter komutu olan 'ClipBlit()' ya da 'BltBitMap()' komutlarından birini kullanırız. Bu komutlar Amiga'nın 'graphics.library' kütüphanesinde hazır. Eğer bu komutları kullanmadan aynı işi yapacaksak, direkt olarak blitter adreslerini kullanmalıyız. İşte bu iş için de en iyisi, assembler bir alt rutin oluşturup bu rutini C dilinde çağırmak.

Şimdi Amiga C'de assembler alt rutinlerinin nasıl kullanıldığına bir bakalım. Vermiş olduğum örnekler, basit assembler örnekleri. Daha gelişmiş örnekleri denemek istiyorsanız, dergimizin yazarlarından Cem Gencer'in yazılarını takip etmenizi öneririm.

Amiga C içerisinde bir assembler program parçası kullanırken, bu programın bir assembler program olduğunu compiler'a bildirmemiz gerekmektedir. Aksi takdirde compiler, yazılan programı, C programı olarak derlemek isteyecek ve hata verecektir. Assembler programını aşağıda olduğu gibi ayırmalıyız;

#asm

move.l $4,a6 … #endasm

#asm ve #endasm, assembler programının başlangıç ve bitiş bloklarını belirtir. Bu satırlar içerisindeki programı C derleyicisi göz önüne almaz. C derleme işlemi bittikten sonra, Assembler derleme programı işlemine başlar ve programın assembler bölümleri burada derlenir. Aynı zamanda C derleyicisi, programın C ile yazılmış kısımlarını assembler'a çevirmiştir. Bu nedenle assembler derleyicisi tamamı assembler olan bir program üzerinde çalışacaktır. Hatırlayacağınız gibi, geçen sayılarda yazmış olduğumuz programların assembler listesinin nasıl alınacağını göstermiştim. Bu yazımızda bu işlemleri daha derinlemesine inceleyeceğiz.

Assembler rutinlerinin kullanımı ile ilgili birkaç program hazırladım. Şimdi isterseniz bu programlara bir göz atalım.

İlk örneğimiz bilgisayarımızın power ışığını söndürüp mouse tuşuna basılıncaya kadar bekleyen ve tekrar power ışığını yakan bir program. Program içerisinde üç rutin mevcut. Bu rutinler led_on(), wait_mouse() ve led_off(). Rutinlerin içerisi assembler ile yazılmış. Şimdi programımıza bir göz atalım;

/* Aztec-C Assembler */ /* alt rutinlerinin */ /* kullanimi; */ /* Ornek 1. */

A/* alt rutinleri çağıran */ /* main bloğu */

main()

{ led_on(); wait_mouse(); led_pff();

}

led_on() { #asm

bset#l,$l,$bfe001 #endasm }

wait_mouse()

( #asm wait:

btst #6,$bfe001 bne.s wait #endasm }

led_off() {

bclr#l,$bfe001 #endasm }

Gördüğünüz gibi, alt rutinleri bir C rutini gibi çağırabiliyoruz. Power ışığını söndürmek için assembler'dan $bfe001 adresinin 1. bitini logic '1' yapmamız yeterli. Daha sonra gene aynı adresin 6. bitinin durumunu kontrol ederek mouse tuşuna basılıncaya kadar bekliyoruz. $bfe001 adresinin 1. bitini tekrar '0' yaptıktan sonra da programdan çıkıyoruz. Programın kullanımı oldukça kolay. Şimdi ikinci örneğimize geçelim.

/* Aztec-C Assembler */ /* alt rutinlerinin */ /* kullanimi; */ /* Örnek 2. */

main() { int m;

while(l) {

m=mouse(); switch(m) { case 0 :printf("mouse off\n"); break; case 1 :printf("mouseon\n"); break; } )

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