Bu sayfadaki yazılar
Sayfanın metni
Sayfa 55
GOTO 40 50 PRINT 55 1,“U2 2 0 18 0” 60 CLOSE 3 65 PRINT 70 CLOSE İ
Bildiğimiz yöntemlerle 18/0'ı buffer'a okuyup 144. byte'ına geliyoruz. A$'in içinde duran yeni disket adını 160 byte'ı ile 16 karaktere tamamlıyoruz. Daha sonra da 50. satırda buffer'a geri yazıyoruz. Satırın sonundaki noktalı virgüle dikkat! Eğer o olmazsa, ismi oluşturan 16 karakterin arkasına bir de 13 ($0D, RETURN karakterinin kodu) byte'ı eklenir, ki bunu pek de istediğimiz söylenemez. 55 numaralı satırda ise, gerçek yazma işlemini yapıyoruz ve buffer'daki yeni bilgiyi olduğu gibi 18/0'a geri yazıyoruz. Disketi initialize ederek, 1541'in disketin yeni adının farkına varmasını da sağladıktan sonra işimizi bitiriyoruz. Directory'i yükleyerek kontrol edin isterseniz...
BLOCK-ALLOCATE (B-A)
Eğer geçmiş iki bölümümüzü izlemişseniz, bu komutun ne işe yaradığını hemen anlamışsınızdır. Disketin saklı duran blok haritasında belli bir bloku dolu göstermek istersek bu komutu kullanmalıyız. Diskete bir program SAVE ettiğinizde, programın kapladığı bloklar otomatik olarak 1541 tarafından BAM'da dolu olarak işaretlenir. Daha sonra diskete yazılacak bir dosya, bu bloklara dokunmaz. Ancak biz normal yolların dışında diskette bir bloğa bir şey yazmışsak, bu bloğu korumamız gereklidir ve bu otomatik olarak yapılmaz. İşte burada imdadımıza B-A yetişir. Formatını bir görelim:
“B-A araç track sector”
Eğer dolu olarak işaretlemek istediğimiz blok daha önceden böyle işaretlenmişse, 65,NO BLOCK,TR,SE mesajı hata kanalında belirir. Burada, TR ve SE ile 1541 bize hâlâ boş duran bir sonraki en yakın blokun adresini vermektedir. Eğer diskette boş görünen bir blok yoksa, bir başka deyişle BAM'da bütün bloklar dolu olarak işaretlenmişse, TR ve SE sıfır olarak geri dönecektir.
Peki, dolu olarak işaretlemek istediğimiz blok aslında disketin üzerinde yoksa ne olacak? Örneğin 10. 82. Sector'ünün diskette olmadığını biliyoruz. Bu durumda da 66,ILLEGAL TRACK OR SECTOR,10,82 mesajını alırız.
Bu gördüklerimizi küçük bir örnekte uygulayalım:
100 OPEN 1,8,15 110 INPUT “TR,SE”;T;S 120 PRINT #1,“B-A 0”;T;S 130 INPUT #1,A,B$,TR,SE 140 IF A—0 THEN 190 150 IF A<>65 THEN PRINT A,B$,TR,SE: GOTO 210 160 IF TR-0 THEN PRINT “BOŞ BLOK GOTO 210 170 IF TR- 18 THEN TR - 18:SE-0 180 T-TR:S—-SE:GOTO 120 190 PRİNT T;S; “DOLDU!” 200 #1,“1” 210 CLOSE 1
Neler yaptık?.. Önce komut kanalı açılıyor. Görüldüğü gibi bir blok okumayacağımız için buffer'a ihtiyacımız yok. 110'da dolu gösterilecek Track ve Sector kullanıcıdan alınıyor.
Şu ana kadar
anlatılan komutlar
pratik, herkesin
kullanabileceği
komutlardı. Şimdi sıra geldi profesyonel olanlara.
Sonra da komut kanalından 1541'e B-A komutu gönderiliyor. 120. satıra dikkat! Track ve Sector numarasını değişken olarak da yazabiliyoruz!.. 130'da da hata mesajını okuyoruz. Eğer hata yoksa, 190'a gidip hangi blok için işaretleme yapıldığını gösteriyoruz. Ancak hata mesajı varsa ve bu 65 numaralı mesaj değilse, 150. satırda mesajı yazıp çıkıyoruz. Eğer 65 numaralı mesaj gelmişse, ama TR numarası 0 ise boş blok kalmamış demektir ve 160. satırda program biter. 170'e geldiğimizde, hata mesajının bir sonraki blok olarak directory zincirinden bir blok seçmesi olasılığına karşı önlem alıyoruz. 180'de de, tüm işlemi bir de yeni blok için deniyoruz. Sonuç olarak, ya kullanıcının verdiği ya da ona en yakın blok (eğer hâlâ boş blok varsa) dolu olarak işaretleniyor ve kullanıcı olup bitenden haberdar ediliyor. Peki, bu dolu olarak işaretlediğimiz, ama aslında bir dosyanın parçası olmayan bloklar ne zamana kadar böyle korunabilirler? Bir sonraki VALIDATE komutuna kadar! Çünkü bu komut, bir dosyaya ait olmayan her bloku boş olarak işaretlemektedir. Dolayısıyla, birbirinden kopuk bloklar kullandığınız disketlerinizi OPEN 1,8,15,“V”:CLOSE 1 ile validate etmemeniz tavsiye olunur...
BLOCK-FREE (B-F)
Bu komut, B-A'nın tam tersi. Daha önce dolu olarak işaretlenmiş (ya sizin tarafınızdan, ya da otomatik olarak) bir bloku tekrar boş göstermeye yarar. Formatı da hemen hemen aynı:
“B-F araç track
Örnek mi istersiniz?..
10 OPEN 1,8,15 20 PRINT #1,“B-F 0 10 10” 30 PRİNT #1,“1” 40 CLOSE |
10/10 numaralı bloku boş gibi gösterdik. Eğer blok daha önce de boşsa, bu bir hata mesajına yolaçmayacaktır. Ama 10/80'i boşaltmaya çalışsaydık. 66 numaralı mesaj gelirdi. Eğer bu komutu kullanarak, bir dosyayı oluşturan bloklardan birini boş göstermişseniz, daha sonra bu diskete bir başka dosya SA VE ettiğinizde, bu blok yeni dosya için kullanılabilir. Bu durumda, eski dosyayı oluşturan blok zinciri kopacaktır ve o dosyanın geri kalan bloklarını hiç geri gelmemek üzere kaybetmiş sayılırsınız. Eğer yeni dosyayı göndermeden validate yaparsanız, eski dosyaya ait bloklar tekrar dolu olarak işaretlenecektir.
BLOCK-EXECUTE (B-E)
Şu ana kadar kullandığımız komutlar her eve lazım, pratik, herkesin kullanabileceği komutlardı. Bundan sonra gelenler ise, profesyonel kullanımlar için. Makina dilini ve en önemlisi 1541'in işletim sistemini, örneğin DOS dökümünü iyi bilmeyi gerektiriyor. Biz burada sadece komutları kısaca açıklayacağız. Böylece ne tür komutlar olduğunu görebilirsiniz. Eğer daha derine inmek ve 1541'e açık kalp ameliyatı yapmak isterseniz, TELETEKNİK'ten bulabileceğiniz “Insight the 1541” kitabına ve özellikle bu kitaptaki DOS dökümüne başvurmanız gerekiyor. Tabii İngilizce biliyorsanız... B-E ile disketteki bir bloktan bir makine dili programı 1541'in buffer'- ına yüklemek ve orada çalıştırmak mümkün. Formatı:
Klavyeyle gezinmek için ← ve → tuşları.
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