Amiga Dünyası sayı 29, sayfa 23

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 23

DİLLER

OpenDevice(TD diskreg->iotd Reg.io Command > TD CHANGENUM; DolOldiskreg); diskChangeCount — diskreg->iotd Reg.io Actual; )

FreeDisk()

( MotorOffO; CloseDevice(diskreg); DeleteExtlO(diskreg, sizeof(struct DeletePort(diskport); |

Program buraya kadar. Programı yazdıktan sonra CHIP memory'de çalışacak şekilde compile etmemiz gerekiyor. Aksi takdirde programımız doğru çalışmaz. Bunun sebebi, geçen aylarda anlattığım copper olayında olduğu gibi, disk işlemlerinin de kontrol register'larının DMA tarafından kontrol edilmesi. Bu da bizim yapı değişkenlerimizin CHIP hafıza bölgesinde bulunmasını gerektiriyor. Compile işlemini, CC *L Prog.c; link İşlemini ise LN *C prog.o -LC32 olarak yazın. Programı ilk olarak örnek parametrelerle bir deneyelim. Programımızın ismini ShowDisk olarak verdim. Buna göre *“ShowDisk 0 0 0' yazdığımızda, program bize sıfırıncı track ve sector olan bootblock bölgesini görüntüleyecektir. Aynı şekilde root bloğu görmek istediğimizde; *ShowDisk 40 0 yazmamız yeterli olacaktır. Dikkat ettiyseniz, program parametrelerini Main içerisinden alıyor. Bu nedenle programın istediği parametreleri program isminden hemen sonra vermemiz gerekiyor. Program listesini ise rutinler haline getirerek daha anlaşılır yapmaya çalıştım. Bu nedenle şimdilik rutin seviyesinde programımızı inceleyeceğiz.

İlk olarak programımız, içerisinden alarak, eğer bir hata yoksa InitDisk(); rutinine sıçrıyor. Bu rutinde *df0;' device'ını bizim kullanabilmemiz için bir *Port' yaratılıyor (CreatePort();). Daha sonra bu port'u kumanda edebilmemiz için *diskreg' yapı değişkeni tanımlanıyor. (CreateExtlO();). Artık bu işlemlerden sonra device'ımızı açıp kullanabiliriz (Open- Device();). Tabii ki bu işi komutu ile gerçekleştiriyoruz. Bu komut sayesinde 'diskreg' yapı değişkeninde hazırlamış olduğumuz isteklerimiz gerçekleştiriliyor. Daha sonra program TnitDisk(); rutininden çıkıp ReadCyISeci(); rutinine sıçrıyor. Bu rutinde ise istenen track, sector ve head parametreleri verilerek diskten track yükleme gerçekleştiriliyor. Bu rutin içerisinde yine *diskreg' yapı değişkeni vasıtasıyla disket için yapmak istediğimiz işlemi belirtiyoruz. Burada bu isteğimizi 'command' struct değişkenine TD READ olarak verdik. Bu macro değişkeni ile “TrackDisk Read' komutunu vermiş oluyoruz. Burada TD WRITE macro değişkenini verdiğimiz de ise, bir yazma işlemini gerçekleştirmiş oluyoruz. Bu sayede disketinizin istediğiniz bir bölgesine bilgi yazabilirsiniz. Bu arada disketten okuma işleminde, okunacak bilgilerin *diskdata' değişkenine yüklendiğini ve BLOCKSIZE (512 sector) uzunluğunda olduğuna dikkat edin. Rutinden geri döndüğümüzde ise, artık gerekli bilgi *“diskdata” değişkenine yüklenmiş olacaktır. Bundan sonra kendimize ayırdığımız Port'umuzu FreeDisk(); rutini ile rahat bırakabiliriz. Programın sonrası ise artık bilgilerin ekrana Text ve yazılmasını sağlamaktadır. Bir noktayı unutmadan belirteyim; her disketten yükleme ya da yazma işleminden önce MotorOn(); sonra Moto- TOffO; rutinlerine sıçramamız gerekir. İşte, Amiga'da Track-Track yükleme ya da yazma işlemleri bunlardan ibarettir. *diskreg' yapı değişkenine verilen diğer trackdisk macro komutlarını, include dosyaları içerisinden trackdisk.h dosyası içerisinden bulabilirsiniz. Sıra geldi ikinci örneğimize. Programımıza bir gözatarak açıklamamıza geçelim.

#include <stdio.h> #include <exec/types.h> #include <graphics/gfx.h> #include <hardware/dmabits.h> #include <hardware/custom.h> #include <hardware/blit.h> #include <graphics/gfxmacros.h> #include <graphics/copper.h> #include <graphics/view.h> #include <graphics/rastport.h> #include <graphics/gels.h> #include <graphics/regions.h> #include <graphics/clip.h> #include <exec/exec.h> #include <graphics/text.h> #include <graphics/gfxbase.h> #include <functions.h>

#define DEPTH 3L #define WİDTH 1020L #define 1020L

#define VPWIDTH 320L #define VPHEIGHT 200L

#define NOT ENOUGH MEMORY -1000

struct View view, struct ViewPort viewport; struct ColorMap *cm;

struct RasInfo rasinfo; struct BitMap bitmap; struçt RastPort rastport;

extern struct ColorMap *GetColorMap(; struct GfxBase *GfxBase;

USHORT colortable(|—| 0x000, Oxfb0, Oxcce, Oxf15, OxaS0, Ox0c5, 0x777, Ox77f, 0x000, 0x55f, 0x000, Oxc57, 0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0

UWORD *colorpalette;

mainlargc, argv) int argc; char

LONG i, n; SHORT nmax>5; SHORT pfl xmove, pfi ymove; UBYTE *displaymem;

GfxBase — (struct GfxBase *)OpenLibrary("graphics.library" OL); if (GfxBase -— NULL) exit(100); oldview — GfxBase->Acti View;

InitBitMap(&bitmap, DEPTH, WIDTH, HEIGHT); InitRastPort(&rastport); rastport.BitMap — &bitmap;

rasinfo.BitMap — &bitmap; rasinfo.RxOffset rasinfo.RyOffset rasinfo.Next — NULL;

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