1541'i Anlamak (10)

(Geçen sayıdan devam)

Okuma ile yazma arasındaki tek fark, pozisyonlama işleminden sonra kullanılan komutların yazmaya değil okumaya yönelik olması. Örneğin demin yazdığımız 15 numaralı kaydı geri okuyalım:

10 OPEN 15,8,15
15 OPEN
4-CHR$(36)
20 PRİNT 4 CHR$(2)
4 CHR$(15) 4 CHRS(0) 4
25 K$-“ ”
30 FOR I-1 TO 36
35
40
45 NEXT I
50 KN$—LEFT$(K$,4)
55 IS$-MID$(K$,5,15)
60 MK$-MID$(K$,20,5)
65 AF$-MID$(K$,25,5)
70 SFE$—-MID$(K$,31,6)
80 CLOSE 1
85 CLOSE 15

Artık gerekli bilgiler değişkenlerin içine yerleşmiştir. 20 numaralı satırda kaydın ilk byte'ı yerine beşinci byte'ı üzerine pozisyonlama yapıp sadece 15 karakter okumak suretiyle, yalnızca malın adını elde etme imkanımız da vardı: Eğer GET yöntemini beğenmiyorsak (nedense?) INPUT 'u da kullanabiliriz. Tabii ki bazı şartları yerine getirirsek:

1) Bir kaydın uzunluğu en fazla 87 karakter ise. Unutmayın, INPUT ile en fazla 88 karakter okunabilir. 87 karakterin arkasına bir de otomatik eklenecek CHR$(13)'ü sayarsak 88'e ulaşırız.

2) Eğer kayıdın içinde bir yerlerde (örneğin arkadaşlarınızın adreslerini saklayacaksanız, adreslerin içinde) noktalı virgül, iki nokta üstüste ve CHR$(13) kodlarının bulunmaması gerekir. Yine geçen sayıdan bildiğiniz gibi, bu kodlar INPUT # komutu için kaydın sonunun geldiğini belirtiyor.

3) Birinci şarta uygun açtığınız dosyaya ikinci şarta uygun bir kaydı yazarken, mutlaka kaydın birinci byte: 1nın üzerine pozisyonlayıp noktalı virgülsüz PRINT # ile yazmalısınız.

4) Okurken de, gene kaydın ilk karakterine pozisyonlayıp INPUT # ile okumanız gerekir.

Gördüğünüz gibi bu yöntem GET #'den daha karmaşık ve zahmetli. Üstelik esnekliği de daha az. Şu ana kadar anlattıklarımız size relatif dosyayı bütün yönleriyle kullanmanızı göstermekte. Bir iki ufak not daha... Daha önceden yazdığınız bir kaydı değiştirmek isterseniz yapacağınız şey, eski kaydın üzerine pozisyonlayıp yeni bilgiyi yazmak. Sıralı dosyada olduğu gibi dosyayı parçalayıp tekrar birleştirme gibi bir dert yok. Ya dosyanın başlangıçta belirlediğiniz uzunluğu yetmezse?.. Sorun yok. Diyelim ki, en başta 100 kayıtlik yer açtınız. Daha sonra da 110 numaralı bir kaydı yazmaya kalkıştınız. Gerçi 1541 göz kırpmaya başlayıp RECORD NOT PRESENT diyecektir ama, bu arada da 101-110 arası kayıtları yaratıp, hepsini CHR$(255) ile doldurup, 100 numaraya da sizin gönderdiğiniz bilgiyi yazacaktır. Yani, dosyanız otomatik olarak uzayacaktır. Ancak bu uzatma işlemi, eklenecek kayıt sayısına bağlı olarak, zaman alacaktır. Zaten en başta belli sayıda kayıt için yer açmamızın nedeni de, normal dosyalama işlemleri sırasında böylesine zaman kayıplarını önlemekti. Eğer bu genişletme sırasında diskette yer kalmazsa, FILE TOO LAR-

GE hata mesajı gelecektir. Bir başka hata da, o anda dosyada bulunabilecek en büyük kayıt numarasından daha büyük bir kayıt numarası ile okuma yapmaya kalkıştığınızda gelecektir. Bu da, RECORD NOT PRE-SENT olacaktır. Relatif dosyaların programlanmasına dair sözlerimiz bu kadar. Şimdi de, relatif dosyaların disket üzerinde nasıl yeraldığını ve DOS'un nasıl kayıtlara eriştiğini görelim. Bunun için DISKMON'u kullanacağız... Önce boş bir disket alın ve formatlayın. Aman disketin gerçekten boş olmasına dikkat edin! Sonra da formatlayınca kaybolabilecek bilgiler için beni suçlamayın... Formatlama işlemi bitince, aşağıdaki programı yazıp çalıştırın:

10
*-CHR$(100)
20 OPENİ,8,15
30 PRİNT CHR$(2)
*-CHR$(70)4 CHR$(0) 4 CHR$(1)
40 PRINT #2;“70 NUMARA”
50 CLOSE2:CLOSE1

Gördüğünüz gibi, RELATİF adı altında, herbiri 100 byte tutan, 79 kayıtlık bir relatif dosya yaratıp, 70 numaralı kaydın ilk byte'ından itibaren “70 NUMARA” yazısını yazdık (nok- -talı virgülsüz...)

Şimdi DISKMON'u yükleyin ve çalıştırın. Bundan sonra yapacağımız işlemlerin sonuçlarını bu yazı ile yayınlanan DISKMON çıktısında da izleyebilirsiniz. Önce .R 12 Ol vererek dosyalar ile ilgili bilgilerin yeraldığı ilk bloku okuyun. .M 00 20.ile bize gerekli olan bilgiyi de ekrana getirin. Directory'i incelediğimiz bölümü hatırlamaya çalışın veya o bölümü de elinizin altına alın. Önce ilk satırdaki $84'e bakalım. Bu byte, ilgili dosyanın REL türünde bir dosya olduğunu belirtiyor. Bu dosyaya ait bilgiler $1l numaralı track'ın $00 numaralı sector'ünden başlıyormuş. Sonra da 16 karakterlik dosya adı geliyor. Bundan sonra gelen üç byte bizim için yeni ve ilginç. Directory yapısını incelerken bu byte'ların REL tipi dosyalarla ilgili olduğunu söylemiş ve es geçmiştik. İşte tam yeri geldi. $11 ve $OA olarak gördüğünüz iki byte, ait oldukları REL tipi dosyanın kullanılmasını sağlayan ve Side-Sector adı verilen bilgilerin disketin üzerinde nerede başladığını gösterir. Side- Sector'ün de ne demek olduğuna bigeleceğiz. Arkadan gelen $64 byte'ı ise 100 olan kayıt birim uzunluğunu belirtir (onaltılık sistemde, tabii ki). Eğer daha önceden yarattığınız bir relatif dosyayı daha sonra kayıt uzunluğunu belirtmeden açarsanız, DOS gerekli kayıt uzunluğu bilgisini buradan alacaktır. Bunu takip eden sıfırlardan sonra gelen $1D ve $00 byte'ları ise, REL tipi dosyamızın şu sırada 29 blok kapladığını belirtiyor. Şimdi gelelim Side- Sector'e... Önce .R 11 OA ile ilk Side- Sector blokunu okuyun ve .M ile tamamını ekrana getirin. Artık cursor ile listeyi yukarı aşağı oynatmayı size bırakıyorum. Side-Sector'de, REL tipi dosyanın içerdiği bilgileri saklayan blokların Track ve Sector numaralarını gösteren bir liste yeralır. Herbir kaydın uzunluğu, kaçıncı kayda ulaşmak istediğimiz ve Side-Sector'deki bilgiler bir araya geldiğinde, aranan kaydın disketin üzerinde tam olarak nerede başladığı bir iki hesaplama ile bulunabilmekte. Şimdi Side-Sector'ün yapısına inelim. İlk iki byte, bir sonraki Side-Sector blokunu gösterir. Üçüncü byte ise 0- 5 arası değerler alır ve o blokun kaç numaralı Side-Sector olduğunu belirtir. Sonra gelen byte ise (864-100), herbir kayıdın uzunluğunu belirtir. Bunu izleyen 12 byte içinde, en fazla altı tane olabilen Side-Sector'lerin herbirinin adresi Track/Sector formatında yeralır. Eğer 6'dan az Side- Sector kullanılmışsa, byte'lar $00 ile doldurulur. Ondan sonra da, sırayla REL dosyayı oluşturan blokların listesi gelir. Eğer birinci Side-Sector bloku dolarsa ikincisi açılır. En fazla 6 Side-Sector olabileceğine ve her bir blok da en fazla 254 karakter alabileceğine göre, en uzun REL Dosya 6*120*254 —182880 karakter alabilir. Bu, zaten 1541'in bir diskete depolayabileceği bilgi miktarından da fazladır. Yani DOS'un değil, disket kapasitesinin engelleyici bir rolü var. Diyelim ki, herbiri 100 karakter olan kayıtlarımızdan 70 numaralı olanına erişmek istedik. DOS, şu işlemi yapar:

(70-1)*100/254

Sonuç 27 ve kalan 42 olacaktır. Demek ki aranılan kayıt, REL Dosyanın 27. blokunun numaralı byte'ından itibaren saklanmaktadır. Dikkat! Bloklar 0, 1, 2,... diye sayılmakta. Yani 27. blok dediğimizde, bir açıdan da 28. blok demiş oluyoruz. Side-Sector'e bakarsak, bu blokun $10/$0C adresinde başladığını görürüz. Bu işlemin açıklanması basit. Her blokta ilk iki byte dışında kalan byte'lar bilgi yazımına ayrıldığına göre, (kayıt uzunluğu/254 formülü, aranan kaydın hangi blokta olduğunu verecektir. Bölmenin kalanı ise, bu blok içinde kaç byte ilerlememiz gerektiğini gösterecektir. Ancak bu sayıya, ilk iki byte'ın kullanılmaması nedeniyle, iki eklememiz gerekiyor... Tabii ki, byte'lar da O, 1, 2,... diye sayılıyor. Şimdi .R 10 0C ile o bloku da okuyup ekrana getirelim. “70 numara” yazısını ve $0D—13 kodunu (noktalı virgül kullanmamıştık!..) göreceksiniz. Eğer yukarıdaki işlem sonucunda 120'den büyük bir blok sayısı elde etseydik, o sayıyı da 120'ye bölerek hangi Side-Sector blokuna bakmamız gerektiğini bulacaktık. Her Side-Sector blokunda diğerlerinin de adresi olduğu için, herhangi birine bir kerede ulaşmak sorun olmayacaktı. REL dosyalarla uğraşırken, un bir tane dosya için, bir tane de Side-Sector için iki kanala ihtiyacı vardır. Bu da daha önce kanallar ve açık dosya sayısı hakkında söylediklerimizi açıklıyor. REL dosyayı okurken, ilk kaydın ilk byte'ından itibaren okur ve bu işlemi devam ettirirseniz, relatif dosyayı sıralı dosya gibi okumuş olursunuz. Eğer işinize gelirse, relatif dosyaları böyle de kullanabilirsiniz.

Yeni yazı dizilerinde buluşmak üzere, hoşçakalın...

64 Emulator

Sayın Commodore Dergisi Yetkilileri; Derginizi 21. sayıdan itibaren alıyorum. Aşağıdaki sorularımı yanıtlarsanız sevinirim. AMIGA 500 bilgisayarda C-64 oyunlarını ve programlarını kullanmak için ne yapmalıyız? AMIGA 500 ile müzik çalışmak ve notaları kayda dökmek için nasıl bir printer'a ve hangi müzik programlaihtiyacımız var? AMIGA 500 için en iyi Resim Animasyon Programı hangisi ya da kolaylık ve kullanılışlılık bakımından hangilerini tavsiye edersiniz? Yayın hayatınızda başarılar dilerim. Tunç Dindaş

Sayın DİNDAŞ Normal olarak AMIGA'da C64 programlarını çalıştıramazsınız. Çünkü iki bilgisayarın yapıları çok farklıdır. Ancak AMIGA'da şu anda iki ayrı firmaya ait emülatörler sayesinde C64 programlarını kullanmanız mümkün. Bu programlar: GO 64 C64 Emülatör II Ancak, programlarınızın C64'te çalıştıkları hızda çalışmalarını beklememeniz lazım. Bundan başka kop- “ya korumalı bazı programlar çalışmayabilir. C64 programlarınızı AMI: GA'ya 1541 disket sürücüsünü kullanarak yükleyebilirsiniz. Bu programları AMIGA'nın 34 inch'lik disketlerine geçirmeniz de mümkün. Ancak 1541 disket sürücüsünü kullanabilmek için ara kabloya ihtiyaç var. AMIGA ile müzik çalışmak için kullanabileceğiniz birçok program var. Bunlara bir örnek olarak AEGIS SONİX programını verebiliriz. Bu programda notaları tek tek yerleştirerek ve istediğiniz müzik aletlerini kullanarak çalıştırabilirsiniz. Ayrıca bu programda daha önceden hazırlanmış parçalar bulabilirsiniz. Yap-