Amiga Dünyası sayı 22, sayfa 31

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 31

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

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