Bu sayfadaki yazılar
Sayfanın metni
Sayfa 41
KICK Pascal
KICK
İster inanın, ister inanmayın (aslına bakarsanız başka da seçenek yok), iki ay önceki dergiyi daha yeni görüyorum. Teknik aksaklıklar her zaman olabilir, lütfen mazur görün. Geçen sayıda telafi yaptık ve şimdi tam tekmil karşınızdayız. Bu ay sizinle ciddi bir konu işleyeceğiz. Hemen olaya geçelim. Program yazarken, arada sırada başka dillerden ek alt programlar kullanmanız gerekebilir. Bu ay konumuz, Pascal ile Assembler arasında bir köprü kurmak. Her şeyden önce bu işleme neden gerek duyacağınızdan bahsedelim. İlk sebep, hız isteyen belirli işlemleri Assembler'dan yaparak programınızın çalışma hızını artırabilir, ancak diğer kısımlarında çok rahat olan Pascal'ı kullanabilirsiniz. Çok karşılaşılan bir ikinci sebep ise, istediğiniz işlemi yapan hazır bir program parçasının herhangi bir dilde mevcut olmasıdır. Buna en iyi örnek Soundtracker gibi müzik programların modülü çalan REPLAY routine'leridir. İki ayrı dildeki programı birleştirirken bazı özelliklere dikkat etmeniz gerekir. Her şeyden önce, ilk olarak her iki programın derlenmesi gerekecektir. Bu işlem sonunda elinizde iki adet obje dosyası oluşacaktır. Daha sonra bu iki dosya birbirlerine LİNK edilerek ortak bir kod üretilecektir. Bu konuya tüm ayrıntıları ile değineceğiz. Vereceğimiz örnekler için, DEVPAC'ın 2.08 Assembler'ını kullandık. Bu marka, hatta dil bile o kadar önemli değil, önemli olan kullanılan dilin obje dosyası oluşturabilen bir derleyiciye sahip olması. Amiga'da daha gelişiminin ilk senelerinde Alink isimli standart bir Link programı geliştirildi. Daha sonra Blink programı bu programı kapsayarak piyasaya sürüldü ve bugünkü standardı temsil eder hale geldi. Blink neredeyse tüm assembler paketlerinde standart olarak bulunabilen ufak bir programdır. Temel görevi, daha önce de belirttiğim gibi iki veya daha fazla obje dosyasını birbirine ekleyerek (Link ederek) ortak bir kod üretmektir. Program örneklerini Plot-3D programından tanıdığınız Erhan Öztop beyler hazırladılar (Bu arada Erhan programının ismini Emath-3D'ye çevirdi, her nedense..). İlk olarak, basit bir iletişim sağlamak istiyoruz. Amacımız, Pascal'da tanımlanan ve Pascal programında kullanılan bir değişkene bir Assembler alt programında bir değer atamak. Yavaş yavaş kolları sıvayalım. Her şeyden önce programlar arası bir alışveriş yapacağımızı belirtmemiz gerekiyor. İlk olarak Pascal tarafına bir göz atalım.
program assembly linkage;
Var erh:word;EXPORT;
Procedure copyy;IMPORT; Begin erh:—100; writeln('simdi erh—',erh); COPYY;
wacin/ coppy rouinini cagirdidan
cagirdiktan
Şimdi programın tanım kısmına bakalım. Burada erh isimli word tipi bir değişken tanımlanıyor. Ancak bu değişken EXPORT olarak tanımlı, kısaca ihraç edilebilecek. Türkçesi, bu değişken başka bir programa aktarılabilir ve bu program tarafından kullanılabilir. Daha sonra bir alt program tanımlıyoruz. İsmi copyy olan bu alt program ise IMPORT; yani bu alt program bu programın içinde yer almıyor, başka bir yerde bulunacak. Şimdilik bu alt programın hiçbir parametresi yok. Buraya kadar olanları bir kere daha özetleyeyim. İlk olarak, program parçaları arası kullanılabilecek bir değişken tanımlıyoruz. Daha sonra ise başka bir programda bulunan bir alt programı bu program içinde kullanmak üzere ithal ediyoruz. Programın geri kalan kısmında sürpriz bir şeyler yok. İlk olarak erh değişkenine bir değer (100) atanıyor, daha sonra ise bu değer ekrana yansıtılıyor (ERH değişkeni hem bu programda, hem de link edileceği diğer programlarda kullanılabilir.). Daha sonra ise copyy alt programı çağrılıyor (Bu alt program şu an yazdığımız program içinde yer almıyor.) ve erh değerine tekrar bakıyoruz. Sonuç sonuçlara gelmeden şu bizim ithalat işi ile ilgilenelim. İşte Assembler'da yazılan müthiş alt program:
XREF erh XDEF copyy Copyy: move.w #2323,erh
Önce belirtelim ki, ithal edilen program parçasının hangi dilde yazıldığını belirtmiyoruz. Pascal, C ve diğer tüm link edilebilen diller kullanılabilir. Biz basit olsun diye assembler seçtik. Burada ilk olarak, erh değişkeni ithal ediliyor. Daha sonra ise ihraç edilecek bir copyy routine'i tanımlanıyor, daha sonra da routine'in kendisi yer alıyor (Hatırlatma: Dergimizin Assembler köşesi mevcut). Yapılan iş gayet basit: sabit bir değer Erh değişkenine aktarılıyor. Program yazmanın amacı, onu kullanmaktır; programı kullanabilmek için çalışması gerekir, öyleyse bu programı çalıştıralım. İlk olarak hem Pascal kısmını, hem de assembly kısmını kendi derleyicilerinde derleyelim ve obje dosyalarını oluşturalım. Elimizde iki adet .o ile biten dosya olacaktır. Diyelim ki, Pascal kısmının ismi Pascal.o, assembly kısmı ise asm.o olsun. Bu programı hayata döndürmek için Mithat'ın HIZIR ACİL'i değil, blink lazım.
BLINK pascal.o ass.o libs:paslib.o to main.exe
Burada kural: İlk olarak ana program gelecek. Ve mutlaka paslib.o dosyası bu programa eklenecek. Hayırlı olsun. Yine bekleriz. Şimdi olayı azıcık geliştirelim, bu sefer alt programa parametre de aktaracağız. Alt programın görevi bir erh değişkenine verilen bir değeri atamak olacak (Pratik bir yararı yok, ama basit bir örnek).
program assembly linkage;
Var erh:word;EXPORT; Procedure copyy(x:word);İMPORT;
Begin erh:—100; writeln('simdi copyy(4500); writeln('coppy cagirdiktan sonra erh—',erh); End;
Bu sefer iş biraz gelişti. Artık ithal ettiğimiz procedure bir word'lük bir parametreye sahip. Copyy(4500) emri ise ERH:=4500; gibi basit bir işleme yarıyor. Assembler alt programı ise
XREF erh XDEF copyy copyy: move.w 4(a7),erh Tts
Şekline geldi. Burada a7'nin Stack Pointer olduğunu, gönderilen parametrelerin Stack'te üst üste yığıldığını ve stack'in düşük adreslere doğru gittiğini hatırlatalım, ve assembly kitaplarında yapacağınız araştırmalarda ekstra başarılar dileyelim. Evet, şu ana dek yaptıklarımız pek bir işe yaramadı. Amacımız, son olarak yararlı bir örnek vermek. Programlarda en çok hız gereken yerlerin başında sıralama yapan kısımlar gelir. 10 sayıyı hizaya sokmak az zaman alır, bir de 10000 ismi sıralayın da görelim. Bu program word'lerden oluşan bir diziyi sıralayacaktır. Sıralama işini bir assembly alt programı yapacak. İşte işin Pascal'cası:
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 40
Şimdi kameraya yaptığımız gibi, ışığa da objeyi takip ettirelim. Align'ı silip, sırasıyla Track to Object'i SPHERE'a yerleştirin. Sphere, Position ve birinci kareyi silin. Add ile 1-29 arasını seçip, Follow Path'i kullanarak objeye path'i takip ettirin. Burada isim olarak PATH'i kullanın. Save changes'i kullandıktan sonra, yeniden Stage Editor'e dönün. Animasyonumuzu kontrol etmek için Animate/Make'i seçin. Animasyonunuzu wireframe olarak görmek için de Animate/Play Loop'u kullanabilirsiniz. Eğer sonuçtan memnun kalırsanız, render edip, bir animasyona sahip olursunuz. Böylece bir yazının sonuna daha geldik. Ben gene her zamanki gibi derginin penceresinde postacının yolunu beklemeye gitmek zorundayım. Bu sebeple hepinize acil selamlar.
isimli efekti yükleyin (Eğer disketinizde — ne aynı efekti yükleyin. Ama bu sefer hiçmevcut değilse, bu efekti başka bir yerden bir değeri değiştirmeden kabul edin. kopyalayın.). Z axisi etrafında, Start Fra- — Info'yu seçtikten sonra, Lightsource.|'i me 2 End Frame 29 ve 360 derece olarak — klikleyin. Conical, Cast shadows ve Indeğerleri girin. Öbür efekt kanalına ise yi- — tensity 700 700 700 olarak ayarlayın.