Disketteki Programların Silinmeye Karşı Korunması: Program Kilidi- SB

Program dökümü: PROG-KILIDI-SB

Mecmuamızın 11. sayısındaki "DİSKET-KURTARAN-SB" isimli programımı okumuş olanlar, SCRATCH komutu ile disketten yanlışlıkla silinen programların nasıl kurtarılabildiğini görmüşlerdir.

Peki, programları silinmeye karşı korumanın bir yolu yok mudur?

Gerçi silinen bir programı artık nasıl kurtarıp ortaya çıkarabileceğimizi biliyoruz, fakat işi baştan sağlam tutup istediğimiz programları silinemez hale getirmek daha yerinde olacaktır. İşte aşağıdaki programımız bu işi başarı ile yapmaktadır.

TRACK: 18/SECTOR: 1

Gerek silinmiş bir programın nasıl kurtarıldığını, gerekse kilitleme işleminin nasıl yapıldığını anlamak için disketteki BANT: 18/SEKTÖR: 1'i yakından incelememiz gerekmektedir.

Bilindiği gibi, 1541 Disk Sürücüsü ile 4040 tipinde formatlanmış bir diskette 35 Bant (Track) bulunmaktadır.

Bu Bantlardan 18 no.lu olanı özellikle çok önemlidir. Bu bantta meydana gelecek bir hasar disketin bir kısmının veya tamamının kullanılamaz hale gelmesine neden olabilir.

Diskette bulunan programlarla ilgili bütün veriler (bu programların adları, disket üzerinde nerede başlayıp nerede bittikleri, hangi tip oldukları, silinmiş veya kilitli olup olmadıkları gibi) bu bantta kayıtlıdır.

18. Bantta toplam 19 adet sektör vardır ve her bir sektör 256 bayttan oluşur. İlk, yani 0 no.lu sektörde BAM, Disket Adı, ID no.su, format tipi gibi temel veriler vardır.

Geri kalan 18 adet sektörde ise disketteki programlarla ilgili veriler vardır, şöyle ki:

Bayt | No:Bulunan Veriler 0 ve 1 | Bir sonraki sektörün Blok ve Sektör no.su, 2 ila 31 | Directory'deki 1. dosyaya ait veriler, 34 ila 63 | Directory'deki 2. dosyaya ait veriler, 66 ila 95 | Directory'deki 3. dosyaya ait veriler, ... 226 ila 255 | Directory'deki 8. dosyaya ait veriler.

Geri kalan sektörlerde de aynı sayıda programa ait veriler kayıtlı olduğundan toplam 18 X 8 = 144 eder, yani bir diskete en fazla 144 adet dosya kaydedilebilir, tabii bunların toplam uzunluğu da en fazla 664 blok olabilir.

Şimdi de örnek olarak 2 ila 31 no.lu baytlar arasında yer alan (Directory'deki 1. programa ait) verilere göz atalım:

Bayt | No:Bulunan Veriler 0 | Dosya tipi 1 ve 2 | Bu dosyaya ait ilk veri (data) blokunun Bant ve Sektör no.su 3 ila 18 | Dosya adı 19 ila 21 | Yalnız Relatif dosyaya ait bazı veriler 22 ila 25 | (kullanılmaz)

26 ve 27 | OPEN @ için, değiştirilen dosyanın Bant ve Sektör no.su. 28 ve 29 | Dosyanın blok adedi, Alt Bayt (LB) ve Üst Bayt (HB) olarak.

Diğer dosyalara ait veriler de aynı düzen içinde sıralandığından 2 ila 31 no.lu baytlar 0 ila 29 olarak yazılmıştır.

Şimdi gelelim işin püf noktasına!

Silinmiş bir programın kurtarılması da, bir programın silinmeye karşı kilitlenmesi de, hep dosya tipini belirleyen baytın değiştirilmesi ile sağlanmaktadır. Bant: 18 / Sektör: 1'de bulunabilecek 8 dosya için bu baytlar: 2, 34, 66, 96, 130, 162, 194 ve 226 no.lu baytlardır.

Bu baytların normal değerleri ile dosya silindiği veya kilitlendiği zamanki değerleri şöyledir:

Dosya tipi | Normal değer SEQ (Sıralısal) | 129 PRG (Program) | 130 USR (Kullanıcı) | 131 REL (Relatif) | 132

Silinince | Kilitlenince 128 | 193 128 | 194 128 | 195 128 | 196

Diyelim ki, yeni formatlanmış bir diskete bir Program Dosyası SAVE ettiniz. Bant: 18/ Sektör: 1'de bu dosyaya ait veriler 2 ila 31 no.lu baytlar arasında yer alacaktır. PRG tipi dosya olduğuna göre 2 no.lu baytın değeri 130'dur.

Şimdi, kanal açıp SCRATCH komutu ile bu dosyayı silersek bu baytın değeri 128'e döner ve BAM'da bu dosyaya ait blokların yerleri boş olarak görünmeye başlar, yani gerçekte dosya silinmiş olmaz. DİSKET-KURTARANSB, bu baytın değerini 130'a çevirir, BAM'ı da düzeltir. Böylece, silinmiş bir dosya da kurtarılmış olur.

PROGRAM-KİLİDİ-SB de benzer şekilde çalışmaktadır. 2 no.lu baytın normalde 130 olan değerini 194'e çevirirsek bu dosya kilitlenmiş olur ve artık SCRATCH komutu ile silinemez hale gelir.

Bir dosyanın kilitlenmesinin veya silinmiş bir dosyanın kurtarılmasının prensip yönünden çok basit olduğu görülüyor. Ancak pratikte kurtarmak veya kilitlemek istediğiniz programın dosya tipini gösteren baytı bulup değiştirmeniz o kadar kolay değildir. Eğer elinizde "Disk Doctor" veya "Disk Monitor" gibi programlar varsa anlattığımız işlemleri bunlar yardımı ile kolayca yapabilirsiniz. Ancak bu tür programlar disketlerin Bant ve Sektör düzenlerinin, ASCII kodlarının ve Hekzadesimal sistemin iyi bilinmesini gerektirir. Halbuki, DİSKET-KURTARAN-SB ve PROGRAM-KİLİDİ-SB'yi kullanmak için bunların hiçbirini bilmenize gerek yoktur. Yükleyip RUN edin yeter.

Nasıl Çalışıyor?

Programı RUN ettiğinizde karşınıza önce bir Menü çıkacaktır.

F1 MENÜ F3 PROGRAM KİLİTLEME (LOCK) F5 KİLİT AÇMA (UNLOCK) F7 DİRECTORY ← SON

Buna göre, F1 Menüye geri dönmenizi, F7 Directory'yi görmenizi sağlamaktadır. ←ile ise programa son verip BASIC'e dönebilirsiniz. İçinde kilitlemek istediğiniz programların bulunduğu disketi yerleştirip F3'e basarsanız size kilitleyeceğiniz programın adını soracaktır. Hatırlayamazsanız F7'ye basarak Directory'i görebilir veya F1'e basarsanız vazgeçip Menü'ye geri dönebilirsiniz. Programın adını doğru ve tam olarak yazıp RETURN'e basarsanız program kilitlenmiş olur. F7'ye basıp Directory'i listelerseniz bu programın adının hizasında en sağda bir < işareti göreceksiniz. Bu işaret programın kilitlenmiş olduğunu gösteren standart bir semboldür.

Eğer programın silinmeye karşı kilitlendiğine inanmıyorsanız, F1 ile Menü'ye geçip ← ile BASIC'e döndükten sonra (veya doğrudan doğruya bilgisayarı açıp kapadıktan sonra) bu programı silmeyi deneyelim. Programın adı da QWERTY olsun.

OPEN 15, 6, 15, "S: QWERTY" CLOSE 15 yazıp RETURN'e basalım. Normal olarak bu komut QWERTY isimli programı siler, daha doğrusu BANT: 18'de bu programın dosya tipini gösteren baytı 126 yapar. Ancak siz LOAD "S" ve LIST komutları ile Directory'i listelerseniz QWERTY isimli programın hâlâ yerinde olduğunu göreceksiniz. Çünkü artık silinmeye karşı "kilitlenmiş" durumdadır.

Şimdi biz açıklamalarımıza devam edelim. Eğer programın adını doğru yazmazsanız veya "wild card" kullanırsanız (yani programın adının ilk birkaç harfini yazıp sonuna koyarsanız) programı kilitleyemezsiniz. Ayrıca disketin yanındaki çentiğin üzeri bantla kapatılmışsa kilitleme işlemi gerçekleşmez ve bir uyarı ibaresi çıkar. Keza kilitlenmiş bir programı tekrar kilitlemek isterseniz "ZATEN KİLİT ALTINDA" ibaresi çıkacaktır.

Kilitli bir programı silmek isterseniz önce kilidi açmanız gerekir.

Bunun için Menü çıktığında F5'e basınız ve kilidini açmak istediğiniz programın adını yazınız. Daha sonra F7'ye basarak Directory'e baktığınızda programın adının hizasında en sağda bulunan işaretinin ortadan kalktığını göreceksiniz, artık bu programı isterseniz silebilirsiniz. Yanlışlıkla silerseniz ne mi olur, DİSKET-KURTARAN-SB programınızı kurtarır.

Bu program (daha doğrusu hiçbir program) yardımı ile disketinizdeki değerli programları FORMATLAMA yolu ile silinmeye karşı koruyamazsınız. Çünkü ID no.su. belirlenerek yapılan formatlama disketin üzerinde ne var ne yoksa siler ve geriye tertemiz bir disket kalır. Bu yüzden, kullanılmış bir disketi formatlamadan önce üzerinde değerli bir program olup olmadığını kontrol etmekte büyük fayda vardır.

Diğer bir tehlike kaynağı da, bir disketin tamamının kopyesini çıkaran BACKUP programlarıdır. Bunlar arka arkaya dolu disket ("master" veya "source" disket) ile boş disket ("destination" veya "target" disket) birkaç defa disk sürücüye takıp çıkarmakla dolu disketin tam bir kopyesini boş diskete aktarır. İşte bu sırada yapacağınız bir sıra hatası dolu disketinizin kısmen veya tamamen silinmesine yol açabilir. Çaresi, dolu disketin yanındaki çentiği önceden bantla kapatmaktır.

Program İle İlgili Açıklamalar

Şimdi biraz da BASIC ile yazılmış programımızın nasıl çalıştığını inceleyelim:

Satır 116: Program ilk iş olarak GOSUB 290 ile, 290 ila 390 no.lu satırlar arasındaki iki makine kodu bölümünü okumaktadır. Bunları sona koymanın amacı, buradaki DATA rakamlarını bellekteki yerlerine POKE etmeye yalnız bir kere ihtiyaç oluşudur.

Satır 290-294: Bellekte 828 ila 1006 arasına 304 ila 346 no.lu satırlardaki DATA'ları yerleştiren bu bölüm, sizin kilitlemek veya kilidini açmak üzere adını yazacağınız dosyanın BANT: 18'de nerede olduğunu bulmakta, dosya tipini belirten baytın yerini P=PEEK (255) ile bulmanızı sağlamakta ve dosyanın durumunu A=PEEK (252) ile görmenizi sağlamaktadır. Bu işleri yapmak için 160 ve 192 no.lu satırlardaki SYS 828 komutu verilmektedir.

Satır 296-298: Bu bölüm ise bellekte 50000 ila 50124 no.lu adreslere, bellekte bulunan programı silmeden Directory okumayı sağlayan ve 360 ila 390 no.lu satırlarda görülen DATA'lardan oluşan makine kodunu POKE etmektedir. Ne zaman F7'ye basılsa SYS 50000 komutu ile ekrana Directory gelmektedir.

Satır 116: RETURN ile dönülen bu satırda, programın çalışırken durdurulmasını önlemek için 788 ve 792 no.lu adreslere 52 ve 193 değerleri yerleştirildikten sonra 244 no.lu satıra atlanmaktadır.

Satır 244-274: Bu bölüm ekrana Menü'yü getirmekte ve basacağınız tuşa göre gereken satıra atlamayı sağlamaktadır.

Satır 150-176: F3'e basmakla geçilen bu bölüm, program kilitleme bölümüdür. Burada önce GOSUB 128 ile ekran düzenlenmektedir. İstediğiniz anda F1 veya F7'ye basarak Menü'ye geri dönmeniz veya Directory'i görmeniz sağlanmaktadır. Daha sonra RETURN ile geri dönüldüğünde, GOSUB 236 ile atlanan bölümde, vermiş olduğunuz dosya adı eğer 16 karakterden kısa ise, SHIFTED SPACE'lerle 16'ya tamamlandıktan sonra bellekte 683 ila 699 no.lu adresler arasına ASCII kodları halinde yerleştirilmektedir. Bu bölüm her dosya adı verildiğinde SYS 828 ile verilen dosyanın diskette bulunup bulunmadığını aramakta kullanılmaktadır.

Satır 214-226: 158 no.lu satırdaki GOSUB 214 ile atlanan bu bölümde, OPEN 15, 6, 15, "IO": OPEN 2, 8, 2, "#" ile disk sürücü önce initialize edildikten sonra bir rastgele erişim (random access) kanalı açılmakta, sonra da hata kanalı okunmaktadır. Bant: 18/Sektör: 1 için Satır 118'de U1 yani Buffer Pointer'i değiştirmeyen bir Block-Read komutu verildikten sonra GOTO 216 ile hata kanalı kontrol edilip Satır 160'a dönülmektedir. SYS 828 ile, verilen dosya adı Bant: 18'de kayıtlı dosyalarla karşılaştırılarak A=PEEK (252) ile dosya tipi tesbit edilmektedir. Eğer (A AND 64)>0 ise bu A'nın değerinin 193 ile 196 arasında olduğunu gösterir ki, dosya zaten kilitli demektir. Aksi halde P=PEEK (255) ile dosya tipini gösteren baytın yeri bulunduktan sonra, PRINT#15, "B-P";2; P:PRINT#2, CHR$(A OR 64) ile yeri P olan baytın değeri 64 ile OR'lanmaktadır. Kilitli olmayan dosyalara ait 129, 130, 131, 132 değerleri 64 ile OR'lanırsa 193, 194, 195, 196 değerleri elde edilir ki, dosya da kilitlenmiş olur.

Satır 182-208: Bu bölüm bir dosyanın kilidini açmaktadır. Burada ise eğer (A AND 64)>0 ise bu defa A değeri 135 ile AND'lenerek 193 ile 196 arası değerler 129 ilie 132 arası değerlere çevrilmekte yani dosyanın kilidi açılmaktadır. Eğer (A AND 64)=0 ise dosya zaten kilitli değil demektir.

Bu açıklamalardan sonra aşağıda programımızı görüyorsunuz.

Bu yazıdaki programlar

Dergideki dökümlerden çıkarıldı; satırlar derginin kontrol toplamlarıyla doğrulandı ve programlar VICE emülatöründe denendi. Tarayıcıdaki C64'te çalıştırabilir, indirip bir emülatöre sürükleyip bırakabilir ya da gerçek bir C64'te LOAD "AD",8,1 ile yükleyebilirsiniz. "Sorun bulundu" yazanlarda bazı satırlar okunamadı ya da tutmadı; düzeltilmiş bir sürümünüz varsa contact@coze.org adresine gönderin.