Commodore sayı 23, sayfa 54
Sayfanın metni

Sayfa 54

PRINT # ile de içlerine yeni bilgiler girilebilir. Yalnız burada bir sorun karşımıza çıkacaktır. Eğer buffer'daki bilgiyi oluşturan byte'lar arasında belli aralıklarla virgül, iki nokta üst üste, RETURN kodu (13) gibi byte'lar yoksa INPUT # sorun çıkaracaktır. Çünkü bu komut en fazla 88 karakter uzunluğunda bilgi okuyabilmektedir. Örneğin arka arkaya gelen 88 byte arasında yukarıda bahsedilen üç byte'dan biri yoksa bilgisayar hata verecektir. Buna bir çözüm, buffer'ları byte byte okumaktır. Bu da GET # ile olur. Ancak bu komut da, eğer bir byte'ın değeri sıfır ise sorun çıkarır. Bu nedenle aşağıdaki gibi bir düzeltme gereklidir:

100 GET ” THEN A$ —- CHR$(0)

Artık tek tek direkt blok komutlarını görebiliriz...

BLOCK-READ (B-R)

Bu komut (Blok Okuma) ile daha önceden ayarladığımız buffer'ın içine disketteki bir blokun okunmasını sağlarız. Komut 15 numaralı hatta ve komut kanalından gönderilmelidir. Ancak B-R komutu okunan blokun ilk byte'ını okumaz. Bu nedenle blokun tamamını okuyan U1 komutu kullanılır. Komutun formatı şu şekildedir: “U1 kanal araç track sector”

Kanal numarası, buffer'ı isterken kullandığımız ikincil adrestir. Araç için 0 yazmamız gerekiyor. Eğer 1541 tek değil de çift sürücülü bir alet olsaydı, buraya hangi sürücüyü kullanmak istediğimizi yazacaktık. Track ve Sector numaralarını da zaten biliyorsunuz. Ancak bu sayıların hepsini onluk sistemde yazmak gerekiyor. DISKMON'daki gibi onaltılık sistem kullanmak hataya yol açacaktır. Şimdi aşağıdaki örnek programa bir göz atın:

10 OPEN 1,8,15 20 OPEN 3,8,2, 1,“U1 2018 0” 40 GET *3,A$,B$ 50 PRINT ASC(A$),ASC(B$) 60 CLOSE 3 70 CLOSE 1

Sonuç olarak 18 ve 1 sayılarını göreceksiniz. Şimdi neler olduğunu açıklayalım. Önce 15 numaralı komut kanalını açıyoruz. Sonra da 2 numaralı kanaldan bir buffer istiyoruz. Buffer geldikten sonra da, 18 0 numaralı Track'ı (yani directory zincirinin ilk halkasını) buffer'a okutuyoruz. Arkasından, buffer'ın ilk iki byte'ını A$ ve B$ içine okuyoruz. Aslında bu iki byte üzerinde daha önce gördüğümüz sıfır byte'ını düzeltecek kontrolü yapmamız gerekirdi. Ancak sonucu önceden bildiğimiz için buna gerek görmedik. Son satırda da gelen byte'ları sayıya çevirip ekrana yazıyoruz. Directory'de 18/00'dan sonra gelen blok 18/1 olduğu için yukarıdaki sonucu elde ediyoruz. Sonunda da kanalları kapatıyoruz.

Yukarıdaki programın 40-50 satırlarını silip aşağıdaki satırları yazın:

40 FOR I- 70 256 45 GETİt3,A$ 50 PRINT A$; 55 .

Şimdi de, 18/0'daki tüm byte'ları karakter şeklinde göreceksiniz. An-

BLOCK-WRITE

(Blok Yaz) bilgileri değiştirip yazmamızı sağlar. Önemli ve aynı zamanda tehlikeli olabilecek bir komuttur bu.

cak bu karakterlerin bu kısmı Commodore 64 için kontrol karakteri yerine geçtiğinden ekranda komik şeyler olabilir. Gene de arada bazı anlaşılır karakter dizileri olduğunu göreceksiniz. Örneğin disketin adı ve ID'si gibi. Aşağıdaki değişikliği yaparsanız, karakter yerine byte değerlerini görürsünüz:

50 PRINT ASC(A$ 4 CHR$(0));

Doğrudan ASC(A$) yazmadığımızı ve böylece kendimizi A$'in boş olması durumunda ASC fonksiyonunun yaratacağı hatadan korumuş olduğumuzu görüyorsunuz. Eğer okuduğumuz blokun tamamını karakter veya sayı olarak listelemekten başka bir şey yapamıyor olsaydık, bu komut pek bir işe yaramazdı. Öyleyse, bir başka komutu görelim...

BUFFER-POINTER (B-P) Bu komut (depo göstergeci) ile, buffer'a okuduğumuz bloktaki byte'ları herhangi birinden itibaren okumaya başlamamız sağlanıyor. Örneğin, geçmiş bölümleri hatırlarsanız, disketin adı 18/0'da 144. byte'dan itibaren 16 bir alan kaplıyordu. Önce B-P komutunun genel formatını görelim, sonra da disketin adını, 18/0'daki diğer byte'ları okuma gereği olmadan nasıl izole edebileceğimize bakalım:

kanal pozisyon

10 OPEN 1,8,15 20 OPEN 30 PRİNT #1,“Ul 20 18 0” 35 PRİNT#1,“B-P 2 144” 40 FOR TO 16 45 GET 46 IF A$- CHR$(160) THEN 60 50 PRINI A$; 55 NEXT I 60 CLOSE 3 70 CLOSE |

Görüldüğü gibi, önce 18/0'ı okuduk ve ikinci kanalın buffer'ının göstergecini 144. byte'ın üzerine getirdik. Sonra da, disketin adını ya 16 karakter oluncaya ya da SHIFT-SPACE'in karakter kodu olan 160'a rastlayıncaya kadar okuduk. B-P ile göstergeci ileri geri oynatmakta hiçbir mahsur yok. 144'e getirip disketin adını okuduktan sonra 0'a getirip bir sonraki Track numarasını öğrenebiliriz. Yani, buffer'ın içeriğini baştan aşağı seri yöntemle inceleme zorunluluğumuz yok.

BLOCK-WRITE (B-W)

Bu komut (Blok Yaz) ise, buffer'daki bilgileri değiştirip disketin üzerine yazmamızı sağlıyor. Önemli, ama kullanımı tehlikeli olabilecek bir komut. Eğer disketin üzerinde yanlış bir yere yanlış bir byte yazarsanız, programlarınızı ve hatta disketinizin tümündeki bilgileri kullanamaz hale gelebilirsiniz. Bizden söylemesi... B-W komutu da B-R gibi buffer'ın ilk byte'ında hata yaratmakta. Bu nedenle onun yerine U2 kullanılır. Formatına gelince:

“U2 kanal araç track

Dilerseniz bunun örneğini disketin adını değiştirerek görelim:

10 OPEN 1,8,15 20 ÖPEN 3,8,2,* * 30 PRİINT41,“Ul 20 18 0” 35 2 144” 36 A$— “DENEME” 40 IF LEN(A$) <16 THEN A$- A$ 4* CHR$(160):

55

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