AMIGA ASSEMBLER

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.

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

MEMF_CLEAR'in kodu ile toplayarak çift şartlı arama da yapabilirsiniz. Aşağıda bütün kodlar listelenmiştir. Bunlardan gerekli olanları toplayarak d1 register'ine yazın. AllocMem fonksiyonunun library ofseti -198.

MEMF_CLEAR = $10000 MEMF_CHIP = $00001 MEMF_FAST = $00002 MEMF_PUBLIC = $00000 İstenen büyüklükte boş hafıza bölgesi bulunduğunda, bunun adresi d0'da kullanıcıya bildirilir. Ayrıca buranın başlangıç adresi ve uzunluğu da sisteme bildirilerek rezerve edilmiş bölgeler listesine yazılır. Bu şekilde multi-tasking bir çalışmada hafıza bölgelerinin çakışması da söz konusu olmaz.

AllocMem ile rezerve edilen bir hafıza bölgesinin işlevi bittikten sonra buranın adresi rezerve edilmiş bölgeler listesinden çıkarılmalıdır. Bunun için de FreeMem fonksiyonunu kullanıyoruz. Bu fonksiyonun da ofseti -210. Gerekli parametreler de gayet basit, a1 register'ine hafıza bölgemizin başlangıç adresini, d0'a da uzunluğunu yazmamız ve bir jsr komutu ile fonksiyonu çağırmamız yeterli.

Exec library'sindeki CopyMem fonksiyonu ile büyük taşıma işlemlerini kolaylıkla yapabiliriz. Blitter, taşıma sırasında aracı olarak kullanıldığından işlem çok yüksek bir hızda gerçekleştirilir. Fonksiyonu kullanmak için kopyalanacak bölgenin başlangıç adresi a0'a, kopyanın yerleştirileceği bölgenin de başlangıç adresi a1 register'inde olmalı. Bunun dışında bir de d0 register'ine kopyalanacak alanın büyüklüğünü yazmamız yeter. Fonksiyonumuzun library ofseti -624.

Aynı şekilde CopyMemQuick daha da hızlı olarak kopyalama yapar. Fakat burada kopyalanacak alan boyutu 4'ün katı olmalıdır. Ancak bu şekilde çok hızlı bir kopyalama işlemi yapılabilir. Kullanılan parametreler yine aynı. CopyMemQuick fonksiyonunun library ofseti ise -630.

Bu ay yine bir hayli library'i inceledik. Ek olarak size ufak bir program sunuyorum. Herhalde bunu inceleyerek anlamanız zor olmaz. Fonksiyonların kullanılış sırasına dikkat edin; bu çok önemli. Programın yaptığı işlem şu: İlk önce, verilen isimde bir file var mı diye kontrol edilmekte. Şayet varsa, bu file'ın fileinfoblock'u okunarak file hakkında birtakım bilgileri öğreniyoruz. Bu bilgilerden FileSize, bizim için çok önemli. Zira az sonra Dos library'sinden Open, Read ve Close fonksiyonları sayesinde file'ı hafızaya aktarıyoruz. Hafızamızı da başka programların ya da sistemin ayırmış olduğu hafıza bölgeleri ile çakışmaması için Exec'ten AllocMem fonksiyonunu kullanıyoruz.

Programın doğru olarak çalışması için, kendi disketinizde yer alan herhangi bir file ismini FILENAME yerine yazın. Zaten programın herhangi bir yerinde hata oluştuğunda direkt programdan çıkılmakta.

; »»»»»»»»»»»»»»»»»»»»»» «««««««««««««««««« 
; >» 
AMIGA VE ASSEMBLER KURSU       <« 
;>»   FİLE DEMONSTRASYON PROGRAMI 01 <« 
;>» 
byCemGENCER-1992 
<« 
; »»»»»»»»»»»»»»»»»»»»»» «««««««««««««««««« 
Q: 
movem.l 
d0-d7/a0-a6,-(a7) 
move.l 
4,a6 
lea 
DOSNAME,a1 
jsr 
-408(a6) 
beq.L 
EXIT 
move.l 
d0,DOSBASE
move.l 
DOSBASE,a6 
move.l 
#FILENAME,d1 
move.l 
#-2,d2 
jsr 
-84(a6) 
beq.L 
EXIT 
move.l 
d0,FILELOCK
move.l 
DOSBASE,a6 
move.l 
FILELOCK,d1 
move.l 
#FILEINFOBLOCK,d2
jsr 
-102(a6) 
beq.L 
EXIT
lea 
FILEINFOBLOCK,a0 
move.l 
4(a0),FILETYPE 
move.l 
116(a0),FILEPROTECTFLAGS 
move.l 
124(a0),FILESIZE 
move.l 
128(a0),FILEBLOCKS
move.l 
4,a6 
move.l 
FILESIZE,d0 
move.l 
#$10000,d1 
jsr 
-198(a6) 
tst.l 
d0 
beq 
EXIT 
move.l 
d0,BUFFER
move.l 
DOSBASE,a6 
move.l 
#FILENAME,dl 
move.l 
#1005,d2 
jsr 
-30(a6) 
tst.l 
d0 
beq 
EXIT 
move.l 
d0,FILEHANDLER
move.l 
DOSBASE,a6 
move.l 
FILEHANDLER,d1 
move.l 
BUFFER,d2 
move.l 
FILESIZE,d3 
jsr 
-42(a6)
move.l 
DOSBASE,a6 
move.l 
FILEHANDLER,d1 
jsr 
-36(a6)
move.l 
DOSBASE,a6 
move.l 
FILELOCK,d1 
jsr 
-90(a6)
EXIT: 
movem.l 
(a7)+,d0-d7/a0-a6 
rts 
;»»»»»»»»»»»»»»»»»»»» ««««««««««««««««««
; >»»»»»»»»» «««««««<« 
; >» 
Turn datalar burada sonra ... 
<« 
;»»»»»»»»»»»»»»»»»»»» ««««««««««««««««««
DOSNAME: 
dc.b 
'dos.library',0 
even 
FILENAME: 
dc.b 
'df0:c/a',0 
even 
DOSBASE: 
del 
0 
FILELOCK: 
dc.l 
0 
FİLESİZE: 
dc.l 
0 
FILEPROTECTFLAGS: 
dc.l 
0 
FILEBLOCKS: 
dc.l 
0 
FILETYPE: 
dc.l 
0 
BUFFER: 
dc.l 
0 
FILEHANDLER: 
dc.l 
0 
NEWFILEHANDLER: 
dc.l 
0 
FILEINFOBLOCK: 
blk.b 
260,0