Amiga Dünyası sayı 22, sayfa 29

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 29

Selam!!! Bir ay aradan sonra sizin kafanızı tekrar Assembler ile uğraştıracağım. Bu ayki menümüzde bol miktarda library fonksiyonları var. Fakat bu sefer değişiklik olsun diye DOS ve EXEC library'lerini dolaşacağız sizlerle. Bu library'ler ilerde kullanacağımız bir sürü fonksiyonu içerdiklerinden, bir an önce öğrenmemizde fayda var. DOS library'sindeki fonksiyonlar yardımıyla diskete rahatlıkla erişebilir ve istediğimiz işlemleri yapabiliriz. EXEC library'sinden göreceğimiz komutlar ise hafıza ayırma, kopyalama gibi komutlar. Dilerseniz hemen ilk fonksiyonlarımıza geçelim.

DOS library'sinde ilk ele alacağımız komut, CreateDir. İsminden de anlayabileceğiniz gibi, diskette adını vereceğiniz directory yaratır. Tabii bunun için disketin write protect'inin uygun konumda olması gerekmekte. İsmini verdiğiniz directory o an içinde bulunduğunuz directory'nin içine açılır. Şayet alt directory'lerden herhangi birine girmemişseniz, direkt olarak ana directory'de bir alt directory açılacaktır. Fonksiyonu kullanabilmek için DOS library'nin açılmış, base adresinin de a6'ya atılmış olması lazım. Açılacak directory isminin adresini de d1 register'ine yazar ve fonksiyonu çağırırsak hemen bir alt directory yaratılacaktır. Unutmayın; isim datalarının sonunda en az bir 0 byte'ı bulunmalı. Aşağıdaki kısa örnek ile DOS library'i açıyor ve CreateDir fonksiyonunu çağırıyoruz. Hemen ardından da program bitiriliyor.

Q: movem.l d0-d7/a0-a6,-(sp) move.l 4,a6 lea DOSNAME,a1 jsr -408(a6)

move.l d0,a6

move.l #DIRNAME,d1 jsr -120(a6)

tst.l d0 beq ERROR move.l d0,DIRLOCK ERROR: movem.l (sp)+,d0-d7/a0-a6 rts DOSNAME: even dc.b 'dos.library',0 DIRNAME: even dc.b .'YENİ DIRECTORY',0

DIRLOCK: even del 0

CreateDir fonksiyonu doğru olarak çağrıldıktan sonra d0 register'inin içeriği 0 ise, directory yaratılamadı anlamına gelmekte. Her şeyi kontrol ettikten sonra fonksiyonu çağırmanızda fayda var. D0 register'inin içeriği 0'dan farklıysa, directory yaratılmıştır. Bu durumda d0'da directory'e ait BCPL göstergeci (BCPL pointer) bulunmaktadır. Bu sayı yardımıyla, daha sonra çeşitli işlemler yapabilirsiniz. Herhangi bir disk işlemi sırasında disket işletim sistemi (DOS-Disc Operating System) file ya da directory'i daha kolay bulabilmek için bir pointer yaratır. Bu pointer hafızada bazı structure'lara direkt işlem yapabilme olanağını sağlar. İşte bu pointer'a biz BCPL göstergeci diyoruz. Tüm önemli DOS fonksiyonları böyle bir pointer istemekteler.

İnceleyeceğimiz bir sonraki fonksiyon, yine DOS library'sinden olan CurrentDir. Hepinizin bildiği gibi CLI directory'sinde bulunan CD komutu ile istediğimiz bir directory'den bir üst ya da bir alt directory'e geçebiliyoruz. Aynı şekilde CurrentDir fonksiyonu da istediğimiz disketin istediğimiz directory'sine girmemizi sağlamakta. Kullanımı hayli basit. DOS library'sini kullanıma hazır hale getirdikten sonra, d1 register'ine girmek istediğimiz directory'nin BCPL pointer'ını yazmamız ve fonksiyonu çağırmamız yeterli. Fonksiyonu çağırdıktan sonra, d0'da ya en son directory'nin BCPL göstergeci kayıtlıdır, ya da 0 bulunmaktadır. Fakat, 0 burada diğer library fonksiyonlarında olduğu gibi hata anlamına gelmez. d0'ın içeriği 0 değerini aldığında, en son bulunduğumuz directory boot disketimizin (açılışı yaptığımız disket!) ana directory'si olduğunu belirtilmekte. CurrentDir fonksiyonunu çağırmak için kullanacağımız library ofset değeri -126'dır.

CurrentDir yardımıyla directory değiştirdikten sonra tekrar bir üst directory'ye dönmek istiyorsak, bunun için ParentDir fonksiyonunu kullanmalıyız. Bunun için BCPL pointer'ını d1 register'ine atmamız gerekmekte. Fonksiyonun çağrılma ofseti ise -210.

DeleteFile fonksiyonu ile istediğimiz herhangi bir file'ı disketten silebiliriz. Bunun için gerekli olan tek şey, file isminin başlangıç adresinin d1 register'inde kayıtlı olması. Fonksiyonumuzun library ofseti -72. Tabii yine her zaman olduğu gibi DOS library'sinin base adresini de a6 register'ine yazmayı unutmuyoruz. Bu hatırlatmaları her seferinde hata yapmamanız için tekrarlıyorum. Satır ya da byte tasarruf etmek için, kullandığınız fonksiyonun library'sinin base adresini a6 register'ine yazmamazlık etmeyin. Benim başıma gelen hataların %40-%50'si sadece bu tür cimriliklerden kaynaklanmakta. Base adresini unutarak farklı bir library fonksiyonu çağırdığınızda, istemediğiniz her şey olabilir. Bu yüzden her library fonksiyonu çağırdığınızda (!) library base adresini KESİN-LİKLE a6 register'ine yazın.

DeleteFile fonksiyonu doğru kullanıldığında hata vermez. Fakat bir hata olduğunda bunu d0 register'i yardımıyla görebilirsiniz. Bu arada bir directory'yi silerken, ilk önce o directory'deki tüm file'ların teker teker silinmesi gerektiğini de hatırlatmalıyım. Aksi halde kolaylıkla hata ile karşılaşabilirsiniz.

Bazen, yazdığımız programlardan CLI'a geçip bir komutu (DIR, COPY gibi) çalıştırmak isteyebilirsiniz. Bunu yapmak için de DOS library'si hizmetimize bir fonksiyon sunmuş durumda. Bu fonksiyonun adı, Execute. Bu fonksiyon yardımıyla disketten istediğimiz programı çalıştırabilir ve sonuçlarını aksi belirtilmedikçe CLI penceresi üzerinden görebiliriz. Fakat bu fonksiyonun tek bir dezavantajı var; o da dezavantaj sayılamayacak kadar basit bir engel. Fonksiyonun doğru çalışabilmesi için, disketin 'c' directory'sinde RUN komutunun bulunması gerekmekte. Bu komutu nereden mi bulacaksınız? Bu soruyu duymamış farz ediyorum! Bu komut olmadan fonksiyonu çağırdığınızda, fonksiyon boş işlev yapar. Verdiğiniz programı çalıştırır gibi gözükse de çalıştıramaz. Normalde Execute fonksiyonunu kullanırken sadece d1 register'ine çalıştırılacak komutun isminin bulunduğu karakter datalarının başlangıç adresi yazılmalıdır. d2 ve d3 register'leri 0 olmalıdır. Fonksiyonun library ofseti, -222'dir. Şayet çağırdığımız programın çıkışını (DIR'de olduğu gibi directory çıkışı) bir file'a kaydetmek istiyorsak, d3 register'ine o file'ın handler'ını yazmamız gerekmekte. Bunun için de daha önceden dosyayı yaratmamız (Open ile) gerekmekte.

Şayet bazı komutlarda olduğu gibi bilgi girişine de ihtiyaç varsa, d2 register'i bilgi girişinin yapılacağı device'in file handler'ını bulundurmalı. d2'ye 0 değeri verdiğinizde, giriş birimi olarak console device (klavye) kabul edilir.

File handler'ı nasıl elde edebileceğimizi soranlar için işte cevabımız: DOS library'sinden Open fonksiyonu doğru olarak çağrıldıktan sonra, d0 register'inde bize istediğimiz file handler'ı verilmekte. File handler'ı BCPL pointer'ı ile kesinlikle karıştırmayın.

Execute fonksiyonunu, yeni bir CLI açmak için de kullanabilirsiniz. Bunun için yapmanız gereken, d1 register'ına boş bir string dizisini göstermek ve d2'ye de daha önceden açmış olduğunuz bir pencerenin file handler'ını yazmak olacak.

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