Bu sayfadaki yazılar
Sayfanın metni
Sayfa 21
Ayrıca, kâğıdın yarısından çoğu boşa gider ve düzensiz bir görünüşe sahip olur. Hele bazı program isimleri, normal harf, sayı ve grafik karakterlerinden farklı bazı karakterlere sahip olduğunda, yazıcı bunlara değişik tepkiler göstermekte, kimi zaman basmamakta, kimi zaman ise kontrolden çıkmaktadır. Bazı disketlerin directory'leri ise üretici firma tarafından, yükleme sırasında bilgisayarı sonsuz döngüye sokacak biçimde hazırlanmıştır. İşte bizim programımız tüm bu zorlukların üstesinden gelecek. Bir kere kâğıda 3 ayrı disketin directory listesi yanyana basılacak, böylece kâğıt israfı ortadan kalkacak. Hatta, eğer yazıcınız MPS802 ise bir sayfaya 90 satır basılacak (normalde 66 satır). Bundan başka, her disket için ayrıca bir başlık verilebilecek. Yükleme işlemi sadece bir tuşa basarak başlatılabilecek. Bütün karakterler kontrolden geçirilecek ve basılamayacak olanlar yerine basılacak. Sonsuz döngüler önlenecek ve sonuçta her şey düzenli bir görünüşe sahip olacak. Şimdi bu programımızı satır satır açıklayalım. 10: Bir karakterin basılıp basılamayacağını öğrenmek için kullanacağımız fonksiyon. Eğer kontrolünü yaptığımız karakter kodu, 32'den küçükse veya 127-160 arasında ise basılamayacak bir karakter demektir. 15: Kullanacağımız değişkenleri belirliyoruz:
20-30: Gerekli sabitler yerine yerleş- tiriliyor. 31-41: Sırası gelen disketin takılma- sı ve bir başlık verilmesi bekleniyor. 42: Başlık, sonuncu karakteri boşluk olan toplam 24 karaktere tamamlanı- yor. Bu arada ZG hangi disketle (O, 1, 2) uğraştığımızı gösteriyor. 45: Daha o disketteki hiçbir dosya okunmadığı için dosya numarası -1'e eşitleniyor. İlk dosya sıfır numaralı ola- cak. 50-90: Komut kanalı ve depo açılı- yor. Disketin adı okunuyor ve her ka- rakteri kontrol ediliyor. Toplam 16 ka- rakter okunduğunda, disket adı DN$ içinde hazır oluyor. Bu arada 0 numa- ralı SECTOR'ün okunduğu işa- retleniyor. Bunu sonsuz döngüyü ön- lemek için kullanacağız. 100-440: Disket |D'si okunuyor, kont- rol ediliyor ve ekleniyor. En son- da da oluşan isim ve ID ekrana bası- İlyor. 120-4140: Her TRACK'daki boş blok sa- yısı BAM'dan okunarak toplanıyor. An- cak 18. TRACK'daki yani directory ta- rafından kullanılan TRAC'daki boş yer- ler bizi ilgilendirmediği için orayı atlı- yoruz. 150: Artık dosyaların okunmasına 18/01'den başlayabiliriz. 160: Eğer o bloku daha önceden okumuşsak, sonsuz döngü başlıyor demektir. O disketi okumayı bırakabi- liriz demek ki. 4161: O bloku okuduğumuzu işaret- liyoruz. 462-170: Sırası gelen bloku depoya okuyup, ilk iki byte'dan bir sonraki
için için için
T&$ Dosya tiplerini saklamak için NM& üç disketteki dosya isimlerini saklamak BLZ üç disketteki dosyaların uzunluğunu saklamak için : üç disketin kalan blok sayısları DN$ : üç disketin adları için HD$ : üç disketin başlıkları için Zi$ £ Dosyanın korunmuş olup olmadığını saklamak için : Dosyanın açık olup olmadığını saklamak TUZ £
Bir daha önce okunup okunmadığını bilmek için
TRACK ve SECTOR'ü öğreniyoruz. 180: O bloktaki 8 dosyayı okumaya başlıyoruz. Önce göstergeci, sırası gelen dosyanın dosya tipini gösteren byte'ına ayarlıyoruz. 190: Dosya tipini okuyoruz ve eğer sıfır ise, yani o yerde bir dosya ile ilgili bilgi yoksa, bir sonraki dosyaya geçiyoruz. 195-230: Dosya numarasını bir artırıp, dosya tipini belirten harfi ve dosya tipinin veya karakterlerine ihtiyacı olup olmadığını saptayıp, dosya adının içine yerleştirerek saklıyoruz. 250-280: Sırası gelen dosyanın adı, her karakteri kontrol edilerek okunup, harf harf N$'in içinde oluşturuluyor. En sonunda da, daha önce belirlenen dosya tipine eklenerek o dosya ile ilgili basılacak satır oluşturuluyor. 290-300: Dosyanın blok uzunluğu okunup hesaplanıyor. 305-310: O dosya ile ilgili bilgiler ekrana basılıyor ve bir sonraki dosya ile ilgili işlemlere geçiliyor. 320: O bloktaki dosyalar bittiğinde eğer hâlâ okunacak başka bir blok varsa, tüm işlemler yeni blok için de tekrarlanıyor. 325: Boş blok sayısı ekrana yazılıyor ve o disketle ilgili tüm okuma işlemleri bittiği için açılmış olan kanallar kapatılıyor. 330: Eğer daima üç disket okunmamışsa, tüm işlemler yeni bir disket için tekrarlanıyor. 340: Artık üç disketten toplanan bilgilerin kâğıda geçirilme zamanı geldi. Önce 6 numaralı kanaldan MPS802'ye satır aralarındaki boşlukları azaltan ve böylece sayfa başına satır sayısını 90'a çıkaran komut gönderiliyor. Sonra da üç disketin başlıkları basılıyor.
345-350: Disketlerin isim ve ID'leri yazılıyor. 355: İlk iki satırın altı çiziliyor. Böylece, bir bakışta kâğıttaki dosya isimlerini bulmak mümkün olacaktır. 360-386: Artık her üç disketteki dosyaların blok sayısı, isim ve tipini yazabiliriz. Her üç directory aynı uzunlukta olmayacağı için her satırda nereye kadar yazı yazılacağını kontrol etmemiz gerekir. Bunu 380-383'te yapıyoruz. 385'te ise başka dosya adı kalmadığını anladığımızda, döngüyü bitiriyoruz. 390-392: Her disketin boş blok sayısını, belli bir uzunluğa getirerek basıyoruz ve açtığımız yazıcı kanalını kapatıyoruz. 395-420: Bilgisayar bir tuşa basmamızı bekliyor. Eğer bu tuş sola bakan ok ise, MPS802'nin satır açıklığı normale döndürülüp program bitiriliyor. Eğer başka bir tuş ise program yeniden başlatılıyor.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 20
Toplam blok uzunluğunu ise 28. ve
29. byte'ların içeriğinden anlayabiliriz. Diyelim ki buralarda 34 ve 1 varsa, © dosya 1*256434-290 blok uzunluğunda demektir. Şu ana kadar disket üzerine yerleşen bilgilerin Track, Sector ve Byte düzeyindeki organizasyonunu gördük. Ancak bunları kullanmanın bir yolu olmasaydı, bunca bilgi hiçbir işe yara- . Mazdı. Eğer bu bilgileri okuyup değiştirebilirsek, çeşitli kullanım alanları bulabiliriz. İşte bu özellik, DOS (DISK OPERATING SYSTEM: - Disk İşletim Sistemi) içine yerleştirilmiş bazı emirleri kullanmakla olmaktadır. Bu emirleri kullanarak istediğimiz bloku okuyup, bu blokun istediğimiz byte'ını değiştirip, tekrar geri yazabiliriz. Şimdi bu komutları ayrıntısıyla görelim.
Komut Kanalı
Disketten bir blok okunduğu zaman, bu blokta bulunan 256 byte'lık bilgi,
VC-15441 içindeki RAM'a yazılır. Bu alanı bir tür depo olarak görebiliriz. Daha sonra da bu deponun içeriğini değiştirip, tekrar disketin üzerine yazabiliriz. Bu nedenle işlemlerimize başlamadan önce, VC-1541'e böyle bir depoya ihtiyacımız olduğunu belirtmemiz gerekir. İşte disketle olan tüm bu ilişkilerimizi, komut kanalı olarak tanımlanan 15. kanaldan gönderdiğimiz komutlarla düzenliyoruz. Bu işlem için ilk önce komut kanalının açılması gerekir: OPEN 1,8,15 Daha sonra da depoyu oluşturmamız gerekir: OPEN Bu son komut, 2 numaralı kanalı (8'den sonra gelen 2) bir depoya bağlar. Artık PRİNT #2 ile yazılacak ve GET #2 ile okunacak her şey bu depodan olacaktır. Artık disketin belli bir blokunu, diyelim ki 18/00'1 okumak istiyoruz. Bunun için komut kanalından, hangi TRACK ve SECTOR numaralı bloku, hangi disk ünitesinden (VC-1541 için 0) ve hangi depoya okumamız gerektiğini bildirmemiz gerekir. Şu komut bu işlemi yapar: PRİNT 20 18 0”
Okuma işlemi anlamına gelir.
e : Depo kanalı a 1 Disk ünitesi numarası 18 TRACK numarası 0 SECTOR numarası
Artık 18/00'ın tüm 256 byte'ı depoya yerleşmiştir. GET# 2 komutu ile bu byte'ları sırayla okuyabiliriz. Bir örnek görelim:
108 OPEN 1,8,15 20 OPEN PRIİINTH1İ,"Ul 2 & 18 40 GETHE,AF,B$
SA PRİNT ASCLAS),ASC (B$)
60 2:CLÜOSE İ
Program çalıştığında, önce komut kanalını açacak, sonra da depoyu oluşturacak (2. kanala bağlı olarak).
Komut kanalına, 18/00'ı 2 numaralı depo kanalına okumak istediğimizi bildirdikten sonra, depodaki ilk iki byte'ı A$ ve B$'e yerleştirecek. En sonunda da bu byte'ları sayıya çevirerek yazacak ve açtığımız kanalları kapatacak. Sonuçta ekrana, 18 ve 0 sayıları yazılacaktır. Bunlar, 18/00'dan sonra gelen bloğun TRACK ve SECTOR numaralarıdır. Hatırlayacağınız gibi, bir bloktaki ilk iki byte, bilginin devam ettiği bir sonraki bloğu göstermekteydi. Eğer depodaki ilk değil de, örneğin 166. byte'ı okumak istersek ne yapacağız. Bunun için de komutu (Buffer pointer, depo göstergeci) kullanılır. Örneğin, PRINT #1,“B-P 2 166” ile, göstergecin iki numaralı kanala bağlı depodaki 166. byte'ı göstermesi sağlanır. Artık GET#2 ile o byte'ı okuyabiliriz. Örneğin, bir disketin 18/00'da olan ve 144. byte'ında başlayıp, maksimum 16 karakter uzunluğa sahip adını okuyup ekrana yazalım.
10 ÖPEN 1,8,15 20 ÜPEN 2,8,2,"#" 30 PRINTH1İ,"UL 2 8 186 O“
40 PRİNTHİ,"B-P 8 144" SA FOR Izi TO 16 BO THEN 88 TG PRINT TI NEKT | 80 CLOSE |
Şimdi de sıra depodaki bilgiyi disketin üzerindeki bir bloğa yazmaya geldi. Ancak bu ve bundan önceki komutları çok dikkatli kullanın. Eğer yanlış yere yanlış bir bilgi yazarsanız, disketinizin üzerindeki dosyalar kullanılmaz hale gelebilir. Okumak için kullanılan komuttaki ile değiştirdiğinizde yazma işlemi gerçekleşir. Yani, PRINT #4 1, “U2 2 0 10 12” komutu ile, 2. kanaldaki depoyu 10/12'ye geri yazmış oluruz. Bu sırada 10/12'de bulunabilecek eski bilgiler silinecektir. İsterseniz, buna örnek olarak, disketin adını nasıl değiştireceğimizi görelim.
18 OPEN 1,8,15 20 OPEN 2,8,2,"H#" 30 PRINTHİ,"U1 2 & 18 O" 40 INPUT "YENİ DİSKET IF LENCAS)<1İ6 THEN GOTÜ 58 PRINTHİ,"B-P 2 144“ TA sö PRINTHİ,"UZ2 2 18 O“ SA PRIİNTHİ,"I" 95 CLÜSE İ
Önce emir kanalını ve depoyu açıyoruz. Sonra yeni disket adını sorup, karakter sayısını CHR$(160) ile 16'ya tamamlıyoruz. Göstergeci 144. byte'a ayarlayıp yeni adı depoya yazıyoruz. Bu sırada, 70. satırdaki noktalı virgüle Diskete bu yöntemle bir şey yazarken daima kullanılmalıdır. Artık depodaki bilgi 18/00'a geri yazılabilir. En sonunda da, yeni adı okuması için emir kanalından "I" (initialize) komutunu gönderiyoruz.
Kullanışlı Bir Program
Artık tüm bu bildiklerimizi güzel bir programda kullanmanın zamanı geldi. Elinde birçok disketi olan VC-1541 sahipleri, hangi diskette ne olduğunu, hangisinde ne kadar boş yer kaldığını hatırlamakta zorluk çekerler. Hele disket sayısı 30'u geçtiğinde bu imkânsızlaşır. Artık tek çözüm, directory'i kâğıda geçirmektir. Bir yazıcıya sahip olanlar bu konuda daha şanslıdır. Ancak yine de birtakım sorunlar beklemektedir kullanıcıyı. Örneğin, her disket için şu iki satırı tekrar etmek gibi: