Amiga Dünyası sayı 23, sayfa 33

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 33

çıkışında da yine bu library'leri her zaman olduğu gibi kapamayı unutmayın. PRTFILENAME rutininde de normalde ekrana basma rutinidir. Fakat ben bu rutini boş bıraktım. Dileyen buraya istediği ekrana basma rutinini yazabilir (CLI ekranına basmak için CON device'ını ya da graphics library'deki Text fonksiyonunu kullanarak). Ayrıca altrutin hiçbir hata kontrolü de yapmıyor. Bunu sadece bir directory'nin nasıl okunabileceğini göstermek için veriyorum.

Unutmayın, file ismi, file header'ının 8. byte'ında başlar. Bizim rutinde file isim string'inin adresi her seferinde FILENAMEADR değişkenine atılmakta.

READDIR: move.I DOSBASE,a6 move.l #DIRNAME,d1 move.I #-2,d2 jsr -84(a6) move.l d0.LOCK

move.l DOSBASE,a6 move.l LOCK.d1 move.l #FILEINFO,d2 jsr -102(a6) move.l d0,d6 LOOP: move.l DOSBASE,a6 move.l LOCK.d1 move.l #FILEINFO,d2 jsr -108(a6) tst.l dO beq ENDOFDIR move.l #FILEINFO+8,FILENAMEADR bsr PRTFILENAME bra LOOP ENDOFDIR: rts

DIRNAME: dc.b "DF0:",0

FILEINFO: blk.l 20,0 FILENAMEADR: del 0 LOCK: del 0

Gördüğünüz gibi, directory okumak gayet basit. Dilerseniz file isminin yanı sıra file header'daki diğer bilgilerin de (protect flag'ları, file uzunluğu, yaratılış tarihi, dosya notu gibi) ekrana basılmasını sağlayabilirsiniz.

Exit Bu fonksiyon, bir programdan ya da task'dan çıkışı sağlamaktadır. Normal rts'den farkı, istediğimiz bir değeri CLI'a programın çıkış kodu olarak aktarır. Bu kodu daha sonra CLI'dan istediğimiz gibi değerlendirebiliriz (FAIL gibi CLI komutlarıyla). Eğer Exit fonksiyonunu bir task içinden çağırmışsak task işlemi durdurulur, task tarafından ayrılan normal hafıza ve stack hafızası geri verilir. Fonksiyonun tek bir parametresi var; o da çıkışta CLI'a aktarılacak olan değer. Bu değeri d1'e yazmamız gerekmekte. Fonksiyonun library ofseti ise -144 (=-$90).

LoadSeg Normalde Amiga'da bir file'ı çalıştırmak istediğimiz zaman, CLI'dan onun ismini yazmamız yeter. ROM rutinleri otomatik olarak o file'ın hafızaya yüklenmesini ve çalıştırılmasını sağlar. Bunu yazmış olduğumuz assembler program aracılığıyla da yapabiliriz. İkinci bir programı assembler'dan çağırmak için iki yöntem mevcut. İlki DOS library'den Execute fonksiyonu. Burada çalıştıracağımız program ismini parametre olarak library fonksiyonuna aktarmamız gerekmekte. Bu yöntemin tek kötü yanı, çalışması için disketin C directory'sinde RUN komutuna gereksinim duymaktadır. Başka bir dezavantaj da bu yöntemde bazen kilitlenmeler olabilmekte. Zira hafıza tam olarak geri verilemeyeceğinden giderek dolmakta. Diğer yöntem ise LoadSeg. Bu yöntem tüm kullandığı hafızayı da geri verdiğinden dolayı en güvenilir olanı. Fakat dilerseniz şimdi biraz teorik bilgi vermek istiyorum. AmigaDOS'ta her program hunk adını verdiğimiz parçalardan oluşur. Bu hunk'lar içerisinde programın kendisi ve programa ait datalar bulunmaktadır. Hunk'ların her birine içindeki bilgiye göre isim verilir. Program kısmını taşıyan hunk'lara HUNK_CODE, data içerikli parçalara HUNK_DATA ve programın çalışması sırasında içeriği belirlenen dataların bulunduğu hunk'lara HUNK_BSS adı verilmiştir. LoadSeg, bir program dosyasını tüm hunk'larıyla yükler ve hunk listesinin bulunduğu adresi bize verir. LoadSeg ile hafızaya yüklenen bir programı çalıştırmak için fonksiyonun geri verdiği adres aracılığıyla ilk program hunk'ının başlangıç adresini bulmalıyız. Bunun için de d0'dan aldığımız değeri ilk önce 4 ile çarpmamız ve bu değere 4 eklememiz gerekmekte. Elde ettiğimiz bu değere basit bir jsr ile de yüklemiş olduğumuz programı çalıştırırız.

LoadSeg fonksiyonunun parametreleri yalnızca bir tane; o da program ismi. Program isminin olduğu string'in başlangıç adresini d1 register'ına yazmamız gerekmekte. Fonksiyonun library ofseti ise -150 (=-$96). UnLoadSeg LoadSeg ile yüklenip çalıştırılan bir program biz onu silinceye kadar hafızada kalır. Ama her bir hunk'ın adresini teker teker bulup o bölgeleri FreeMem ile serbest bırakmamız çok dolaylı bir iş olacağından, bunun yerine ROM'daki bir fonksiyon olan UnLoadSeg fonksiyonunu kullanabiliriz. Bu fonksiyon yardımıyla yüklenmiş olan hunk'ın tüm kapladığı hafıza alanları tekrar sisteme geri iade edilecektir. Bu fonksiyonun da tek parametresi var; o da segment adresi. LoadSeg'i çağırdıktan sonra d0 aracılığıyla elde ettiğimiz değeri UnLoadSeg'i kullanmadan hemen önce d1 register'ına yazmalıyız. Fonksiyonun library ofseti -156 (=-$9c).

Seek BASIC dilini kullananlar bilirler; BASIC'te bir sequential dosya açmak çok kolaydır. OPEN ve PRINT# komutlarıyla bu işi rahatlıkla yapabilirsiniz. Assembler'da bu, library kullanarak daha da kolaydır. DOS library'sindeki Seek fonksiyonu tam istediğimiz işi yapmakta; bir dosyanın istediğimiz yerini okumayı ya da yazmayı sağlamakta. Bunun için de dosyayı komple hafızaya okuyup değiştirdikten sonra da tekrar diskete yazmaya gerek yok. Seek ile file pozisyonunu başlangıçtan itibaren istediğimiz byte öteye ya da bitiş pozisyonundan itibaren istediğimiz byte kadar geriye alabiliriz. Ayrıca üçüncü bir mod ile de o an bulunduğumuz pozisyondan istediğimiz byte kadar ilerisine de gitmemiz mümkün. Fonksiyonu çağırmadan önce d1'e file handler pointer'ını (Open ile elde ettiğimiz), d2'ye de pozisyon ofsetini yazmalıyız. d3 register'ı Seek'in çalışma şeklini belirler. Başlangıçtan itibaren belli bir ofsete ulaşmak istiyorsak buraya OFFSET_BEGINNING (=-1), o anki pozisyondan itibaren belli bir noktaya ulaşmak istiyorsak OFFSET_CURRENT (=0) değerlerini yazmalıyız. Sondan geriye doğru belli bir ofset değerine gidilecekse, kullanılacak değer OFFSET_END'in karşılığı olan 1 olmalıdır. Fonksiyonu çağırmak için kullanacağımız library ofseti, -66 (=-$42). Seek'i çağırdıktan sonra d0'da elde ettiğimiz değer fonksiyonu çağırmadan önceki file offset pozisyonudur. O anki file pozisyon offset'ini öğrenmek için Seek'i OFFSET_CURRENT modunda ve 0 offset değeriyle çağırmanız yeterli olacaktır. Bir file'ın sonuna gitmek içinse OFFSET_END modunu 0 offset değeriyle kullanmalısınız. Aynı şekilde 0 offset değeriyle MOD-

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