Amiga Dunyasi - Sayi 26 (Temmuz 1992).pdf - Retro Dergi
Amiga Dunyasi - Sayi 26 (Temmuz 1992).pdf - Retro Dergi
Amiga Dunyasi - Sayi 26 (Temmuz 1992).pdf - Retro Dergi
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
DİLLER<br />
A<br />
M<br />
I<br />
G<br />
A<br />
CENKER OZKURT<br />
Bu ayki yazımızın konusu, <strong>Amiga</strong> C'de Assembler alt rutinlerinin<br />
kullanımı. Assembler bildiğiniz gibi bilgisayarın en temel dili<br />
olarak kullanılıyor. Assembler programlan araya hiçbir yorumlayıcı<br />
girmediğinden çok hızlı çalışabiliyor. Hız her programcının<br />
istediği bir özellik. Bu nedenle özellikle oyunlar assembler dili<br />
ile yazılmakta. Assembler dilini diğer dillerden ayıran en büyük<br />
özellik; sisteme direkt olarak ulaşabilmek. Örneğin <strong>Amiga</strong>'nın<br />
blitter cipine ulaşmak, assembler dili ile oldukça kolay. Bu sayede<br />
de sistemi tam performans çalıştırabiliyorsunuz. Hızlı<br />
scroll'lar kayan yazılar, vektör hesaplan ve çizimleri bu tür bir<br />
yazılım gerektiriyor.<br />
<strong>Amiga</strong> C'de yazılan programların hemen hepsi sistem komutlarım<br />
kullanır. Bu komutlar Library dediğimiz kütüphanelerde bulunuyor.<br />
Bildiğiniz gibi kullanılan Library'ler genellikler<br />
'graphics.library', 'intuition.library', 'dos.library' ve diğerleridir.<br />
Eğer biz bu library'leri kullanmadan program yazmak istersek,<br />
işte o zaman sisteme direk olarak ulaşıp işimizi görmeliyiz. Tabii<br />
bu iş için de <strong>Amiga</strong> sistemini ve yapısını iyi tanımamız gerekmektedir.<br />
Örneğin açmış olduğumuz iki ekrandan birindeki resmi<br />
diğer ekrana taşımak istiyoruz. Bu işi <strong>Amiga</strong> C'de yaparken bir<br />
blitter komutu olan 'ClipBlit0' ya da 'BltBitMap0' komutlarından<br />
birini kullanırız. Bu komutlar <strong>Amiga</strong>'nın 'graphics.library'<br />
kütüphanesinde hazır. Eğer bu komutları kullanmadan aynı işi<br />
yapacaksak, direkt olarak blitter adreslerini kullanmalıyız. İşte bu<br />
iş için de en iyisi, assembler bir alt rutin oluşturup bu rutini C dilinde<br />
çağırmak.<br />
Şimdi <strong>Amiga</strong> C'de assembler alt rutinlerinin nasıl kullanıldığına<br />
bir bakalım. Vermiş olduğum örnekler, basit assembler örnekleri.<br />
Daha gelişmiş örnekleri denemek istiyorsanız, dergimizin<br />
yazarlarından Cem Gencer'in yazılarını takip etmenizi öneririm.<br />
<strong>Amiga</strong> C içerisinde bir assembler program parçası kullanırken,<br />
bu programın bir assembler program olduğunu compiler'a bildirmemiz<br />
gerekmektedir. Aksi takdirde compiler, yazılan programı,<br />
C programı olarak derlemek isteyecek ve hata verecektir. Assembler<br />
programını aşağıda olduğu gibi ayırmalıyız;<br />
#asm<br />
move.l $4,a6<br />
…<br />
#endasm<br />
#asm ve #endasm, assembler programının başlangıç ve bitiş<br />
bloklannı belirtir. Bu satırlar içerisindeki programı C derleyicisi<br />
göz önüne almaz. C derleme işlemi bittikten sonra, Assembler<br />
derleme programı işlemine başlar ve programın assembler bölümleri<br />
burada derlenir. Aynı zamanda C derleyicisi, programın C<br />
ile yazılmış kısımlarını assembler'a çevirmiştir. Bu nedenle assembler<br />
derleyicisi tamamı assembler olan bir program üzerinde<br />
çalışacaktır. Hatırlayacağınız gibi, geçen sayılarda yazmış olduğumuz<br />
programların assembler listesinin nasıl alınacağım göstermiştim.<br />
Bu yazımızda bu işlemleri daha derinlemesine inceleyeceğiz.<br />
Assembler rutinlerinin kullanımını ile ilgili birkaç program ha-<br />
zırladım. Şimdi isterseniz bu programlara bir göz atalım.<br />
İlk örneğimiz bilgisayarımızın power ışığını söndürüp mouse<br />
tuşuna basılncaya kadar bekleyen ve tekrar power ışığını yakan<br />
bir program. Program içerisinde üç rutin mevcut. Bu rutinler<br />
led_on(), wait_mouse() ve led_off(). Rutinlerin içerisi assembler<br />
ile yazılmış. Şimdi programımıza bir göz atalım;<br />
/* Aztec-C Assembler */<br />
/* alt rutinlerinin */<br />
/* kullanimi; */<br />
/* Ornek 1. */<br />
/* alt rutinleri çağıran */<br />
/* main bloğu */<br />
main()<br />
{<br />
led_on();<br />
wait_mouse();<br />
led_pff();<br />
}<br />
led_on()<br />
{<br />
#asm<br />
bset#l,$l,$bfe001<br />
#endasm<br />
}<br />
wait_mouse()<br />
(<br />
#asm<br />
wait:<br />
btst #6,$bfe001<br />
bne.s wait<br />
#endasm<br />
}<br />
led_off()<br />
{<br />
bclr#l,$bfe001<br />
#endasm<br />
}<br />
Gördüğünüz gibi, alt rutinleri bir C rutini gibi çağırabiliyoruz.<br />
Power ışığını söndürmek için assembler'dan $bfe001 adresinin<br />
1. bitini logic ' 1' yapmamız yeterli. Daha sonra gene aynı adresin<br />
6. bitinin durumunu kontrol ederek mouse tuşuna basılıncaya kadar<br />
bekliyoruz. $bfe001 adresinin 1. bitini tekrar '0' yaptıktan<br />
sonra da programdan çıkıyoruz. Programın kullanımı oldukça<br />
kolay. Şimdi ikinci örneğimize geçelim.<br />
/* Aztec-C Assembler */<br />
/* alt rutinlerinin */<br />
/* kullanimi; */<br />
/* Örnek 2. */<br />
main()<br />
{<br />
int m;<br />
while(l) {<br />
m=mouse();<br />
switch(m) {<br />
case 0 :printf("mouse off\n");<br />
break;<br />
case 1 :printf("mouseon\n");<br />
break;<br />
}<br />
)<br />
AMIGA DÜNYASI 22