Amiga Dünyası sayı 22, sayfa 30

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 30

Diskette yaratılmış olan bir file'ın ismini değiştirmek de çok basit. Bunun için de, dos library'sinin içinde bir hazır fonksiyon var. Bu fonksiyonun ismi Rename ve ofseti de -78. Fonksiyon, doğru çalışabilmek için iki parametreye ihtiyaç duymakta: Eski isim ve yeni isim. Eski ismin bulunduğu string'in başlangıç adresini d1'e, yeni isim string'inin başlangıç adresini ise d2 register'ine yazmamız gerekmekte. Bir hatayla karşılaşıldığında, bu d0 register'i aracılığıyla size bildirilecektir. Yeni isimde başka bir file ya da directory varsa, fonksiyon hata verir. Rename aracılığıyla bir diskette bulunan bir file'ı, aynı disketin başka bir directory'sine aktarmak mümkün. Bunun için, isim string'inin başına directory'i aynı CLI'da olduğu gibi girmeniz gerekmekte. Fakat bu şekilde bir file'ı başka bir diskete kopyalamanız mümkün değil. Denemeye kalkıştığınızda da fonksiyon hata verir.

Bildiğiniz gibi, CLI'da her file'a ait bir açıklama notu (Comment) bulunmakta. Bu açıklama kısmına dilediğiniz her şeyi (program hakkında kısa ve açıklayıcı bilgi ya da yazan kişi gibi) yazabilirsiniz. Açıklama notu olarak 80 karakteri geçmeyen bir string kullanmanız gerekmekte. Tabii bu daha kısa olabilir, yeter ki uzun olmasın. Açıklama notu eklenecek file'ın isminin bulunduğu string'in başlangıç adresi d1 register'inde, notumuzun kendisinin başlangıç adresi de d2 register'inde kayıtlı olmalı. Fonksiyonun library ofseti ise -180.

Bazı file ya da directory'leri CLI aracılığıyla silmeye ya da değiştirilmeye karşı koruyabiliriz. Bunun için mevcut 8 protect flag'ını (1.2'lerde 4 flag!) kullanmamız yeterli olacak. Aynı işlemi assembler'dan yapmak istersek dos library'sinde bulunan SetProtect fonksiyonunu kullanmamız gerekir. Protect flag'ları değiştirilecek dosya ya da directory isminin başlangıç adresi d1 register'ine yazılmalı. Flag'ların yeni konumlarını belirleyen maske ise d2 register'ine yazılmalı. Bu maske, binary olarak flag'ları içermekte. İlk bit (değeri 1) DOS'taki D flag'ının karşılığıdır. Aynı şekilde ikinci bit (değeri 2) E flag'ını, üçüncü bit (değeri 4) W flag'ını ve dördüncü bit de (değeri 8) R flag'ını temsil etmekte. Diğer 4 bit pek kullanılmadığından, burada boşuna yer harcamak istemiyorum. Merak edenler için belirteyim, diğer flag'lar için de 5. ve 7. bitleri kullanmalısınız.

Gelelim DOS library'sindeki en can alıcı fonksiyonlara. Bunlardan ilki Open. Bir dosya açmamızı sağlayan bu fonksiyonun ofseti, -30. Open fonksiyonunu iki şekilde kullanabilirsiniz. Bunlardan ilki olan MODE_OLDFILE ile eski bir dosya kullanıma açılır. MODE_NEWFILE ise diskette yeni bir dosya yaratır ve bunu kullanıma hazır hale getirir. Dosyanın isminin bulunduğu string'in başlangıç adresi d1'e, fonksiyonun kullanım şekli ise d2 register'ine yazılmalı. Şayet verdiğiniz isimde bir dosya varsa ve MODE_NEWFILE'ı seçmişseniz, eski file silinir ve yerine yenisi açılır. Tabii assembler kullanırken fonksiyonun kullanım şeklini yazı olarak değil de sayısal olarak vermemiz gerekmekte. MODE_OLDFILE'ın karşılığı 1005, MODE_NEWFILE'ın değeri ise 1006'dır. Bu değerlerden istediğimiz birini d2 register'ine yazmamız ve fonksiyonu çağırmamız, işlemin uygulanması için yeterlidir. Her şey doğru giderse, fonksiyon bize d0 register'inde açılan dosyanın file handler'ını verir. Bunu artık Read ve Write'da kullanabiliriz.

Open fonksiyonu ile açılan bir file'ın işi bittiğinde, kesinlikle Close fonksiyonu yardımıyla kapatılmalıdır. Aksi halde o file içindeki bilgileri yitirebiliriz. Close fonksiyonunu kullanmak için file'ın file handler'ını d1 register'ine yazmamız ve ardından da -36 ofseti ile fonksiyonu çağırmamız yeterli.

File handler'ını elde ettiğimiz bir file'ı okumak, yazmak ya da file'a ekleme yapmak istersek, DOS library'deki iki fonksiyon işimizi görecektir. Bunlardan ilki Read'dir. Ofseti -42 olan bu fonksiyon, üç parametreye ihtiyaç duymakta. İlki, file'ın file handler'ının yazıldığı d1 register'i. File'daki bilgilerin hafızaya kopyalanacağı adres ise, d2 register'ine yazılmalı. Son olarak d3 register'inde de okunacak bilginin uzunluğu olmalı. Bu file uzunluğu kadar ya da ondan kısa olabilir. Kısa olduğu zamanlarda sadece file başlangıcından uzunluk kadar bölge okunur ve hafızada verilen adresten sonrasına yazılır. Fonksiyon d0 register'inde okunan byte miktarını bildirir. Eğer bu değer 0 olursa, file'ın sonuna gelindiğini anlayabiliriz. -1 değeri ise okuma sırasında bir hata oluştuğunu gösterir.

Write ile istediğimiz bilgiyi açtığımız file'a yazabiliriz. Read fonksiyonunda olduğu gibi, Write da aynı üç parametreye gereksinim duymakta. Write fonksiyonun ofseti ise -48. Fonksiyon çağrıldıktan sonra d0 register'inde ya byte olarak yazılan data miktarı ya da hata mesajını tanımlayan -1 değeri bulunur. d0 aracılığıyla bu fonksiyonda hata olup olmadığını kontrol etmenizde fayda var. Oluşabilecek en basit hata bile bilgilerin diskete kaydedilmesini önleyeceğinden, bilgileriniz kaybolabilir.

Gelelim Examine fonksiyonuna. Ofseti -102 olan bu fonksiyon yardımıyla bir file'a ya da directory'e ait bazı temel bilgileri elde edebiliriz. Bunun için, file'ın ya da directory'nin BCPL pointer'ını d1 register'ine, uygun boyutta boş bir hafıza alanının da başlangıç adresini d2 register'ine yazmalıyız. File bilgi datalarının gerek duyduğu alan büyüklüğü 260 byte'dır. Fonksiyon çağrıldıktan sonra hata oluşmamışsa, ayırdığımız boş alanda bazı bilgiler kayıtlı olacaktır. Hata durumunda zaten d0 register'i 0 değerini alacağından, bunu zamanında algılayabilir ve uygun altroutine dallanabiliriz. Aşağıda fonksiyon çağrıldıktan sonra, boş alanda bulunan bilgiler ofsetleriyle birlikte bulunmakta.

Bu bilgi bloğunun diğer bir ismi de FileInfoBlock'tur. Ofset İsmi Tanımı

0 fib_DiskKey 4 fib_DirEntryType 0'dan küçükse file, büyükse directory 8 fib_FileName File ismi (30 kullanılabilir karakter) 116 fib_Protection DOS protect flag'ları 120 fib_EntryType 124 fib_Size Byte olarak file uzunluğu 128 fib_NumBlocks Disket sektörü olarak file uzunluğu 132 fib_Date File yaratılış tarihi 144 fib_Comment File açıklama notu (80 karakter) 224 fib_Reserved İlerki kullanımlar için Gelelim Lock fonksiyonuna. Bu fonksiyon, file'ın diskette varlığını kontrol etmek için işe yarar. Ayrıca diğer bazı fonksiyonların (Examine) ihtiyaç duydukları BCPL pointer'ını da temin etmemizi sağlar. Sırf file'ın varlığını kontrol etmek için Open ve Close fonksiyon ikilisi biraz fuzuli harcama olur. Bize sadece file'ın varlığının kanıtlanması yeterli olacağından DOS bunun için de ayrı bir fonksiyon sunmuş kullanıcılara. İki şekilde Lock işlemi yapılabilir; ACCESS_READ ve ACCESS_WRITE. İlki, bize sadece okunabilir bir lock bilgisi verir, ikincisi ise hem okunur hem de yazılabilir bir lock yaratır. Eğer fonksiyonu çağırdıktan sonra d0 register'inin içeriği 0 ise kontrol edilen file bulunamadı demektir. Fonksiyonun gerek duyduğu ilk parametre file isminin bulunduğu string'in adresi. Bu değer d1 register'ine yazılmalı. Fonksiyonun kullanım modu ise d2 register'ine yazılmalı. Bu arada fonksiyonu çağırmak için kullanacağımız ofset -84.

Lock'u başarılı olarak kullandıktan sonra, Lock'u kapatmak için UnLock fonksiyonunu kullanmalıyız. Lock'ta d0'da elde ettiğimiz BCPL pointer'ını d1'e yazıp -90 ofsetiyle bu fonksiyonu doğru olarak kullanabiliriz.

Eh, bu aylık bu kadar DOS fonksiyonu yeter sanırım. Şimdi dilerseniz biraz da EXEC fonksiyonlarına göz atalım. İlk ele alacağım fonksiyonun ismi AllocMem ve sistem kurallarına uygun olarak hafıza bölgesi ayırmamıza yarıyor. d0 register'ine istediğimiz alanın büyüklüğünü byte olarak yazmalıyız, d1 register'i ise ayrılacak hafıza bölgesi hakkında bazı önemli bilgiler taşımakta. MEMF_PUBLIC, MEMF_CHIP ve MEMF_FAST yardımıyla ayrılacak hafızanın nerede olacağını belirleyebiliriz. MEMF_CHIP, $00000000-$0007ffff adresleri arasında bir bölge arar. MEMF_FAST ise chip memory dışında kalan hafızada uygun bir boş alan arar. MEMF_PUBLIC, hafıza genişletme kartı takılıysa boş alanı fast memory'de arar. Eğer hiçbir hafıza genişletme kartı takılı değilse, boş alan direkt olarak chip memory'de aranır. Bu modların dışında bir de MEMF_CLEAR vardır. Bunun sayesinde aranan hafıza alanının 0'larla dolu olmasına dikkat edilir. Hafıza alan sınırlama kodlarından birini

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