Bu sayfadaki yazılar
Sayfanın metni
Sayfa 27
Bize lazım olan ilk 6 bittir. Yani bizim kullanacağımız ekran kodlu bir karakterin genel yapısı şöyle olacaktır. % 0 0 x x x x x x Bitlerin sıralanışı soldan sağa ve 7 6 5 4 3 2 1 0 şeklindedir. “ABCD” yazısını sıkıştırdığımızda 3 baytlık anlamsız bir yazı ortaya çıkacaktır. Şimdi diyeceksiniz ki, “Bu kadar işlemi sadece 1 bayt için mi yapacağız?” Ben de evet diyeceğim. Bu program temel programdır ve ayarlanınca isterseniz bütün hafızayı sıkıştırabilirsiniz. Şu anki yapısıyla programda geçen “length” değişkenini 192 yaparsanız 1 blokluk (256 baytlık) ve ekran kodlarıyla yazılmış bir yazıyı rahatça şifreleyebilirsiniz. Nitekim, yazının başında bir oyun için kullandığımı yazmıştım. Ekran belleği 1 Kbyte’tır ve bu rutine bir iki ekleme yaparak 768 bayt olarak kısaltabilirsiniz. İşi biraz daha büyütürsek 20 ayrı ekran görüntüsünü hafızada sakladığınızı varsayalım. 20 ekran = 20 Kbyte eder. Bu programı kullanarak 20 ekranın kapladığı alan 16 Kbyte’a iner. Alın size 4 Kbyte’lık tasarruf. Sadece her 4 bayt’ta 1 bayt tasarruf ile nerelere geldik. Tabii bir de şöyle bir soru var. Ben bu programı sadece ekran için mi kullanacağım? Hayır. Mesela bir program yazdınız ve programa kendi adınızı vs. info olarak yerleştirdiniz. Programınız çalışınca adınız çıkacak daha sonra program kullanılacak. Ama bazı lamer’lar sizin adınızı kendi adıyla değiştirerek ortaya çıkabilirler. İşte bu program ile adınızı sonsuza dek koruyabilirsiniz. Adınız, bilgileriniz şifreli bir şekilde programın herhangi bir yerinde duracaktır ve program çalışınca deşifre rutini devreye girerek adınızı vs. şifresiz şekilde ekrana yazacaktır. Kullanma alanı tamamen size kalmıştır ve konuyu daha fazla dağıtmadan programın açıklamasına devam edelim. En son bize lazım olan ilk 6 bit demiştik. Yaptığımız işlemler şöyle. 1. harf xxx, 2. harf yyy, 3. harf vvv, 4. harf zzz ile gösterilsin. Ayrıca işlem sonunda şifreli sonucu saklayacağımız adresleri de SAKLA0, SAKLA1, SAKLA2 olarak adlandıralım. Bir de geçici işlemler için TEMP isimli adres olsun. 1 – 1. harfi 2 kez sola kaydırın ve TEMP’e yazın : 00xxxxxx şu hale gelir % xxxxxx00 % TEMP’e 2 – 2. harfi 4 kez sağa kaydırın ve sonuca TEMP ile OR işlemi uygulayın ve sonucu SAKLA0’a yazın : 00yyyyyy şu hale gelir % 000000yy % OR işleminden sonra sonuç xxxxxxyy % SAKLA0’a 3 – İkinci harfi 4 kez sola kaydırın ve sonucu TEMP’e yazın : 00yyyyyy şu hale gelir % yyyy0000 % TEMP’e 4 – 3. harfi 2 kez sağa kaydırın ve TEMP ile OR işlemi yapın ve sonucu SAKLA1’e yazın : 00vvvvvv şu hale gelir % 0000vvvv % OR işleminden sonra sonuç yyyyvvvv % SAKLA1’e 5 – 3. harfi 6 kez sola kaydırın ve sonucu TEMP’e yazın : 00vvvvvv şu hale gelir vv000000 % TEMP’e 6 – Son harfi ile TEMP arasında OR işlemi yapın ve sonucu SAKLA2’ye yazın : vv000000 % OR TEMP % sonuç vvzzzzzz % SAKLA2’ye Gördüğünüz gibi bütün işlem bu kadar. İşlem sonunda hafızada 00xxxxxx, 00yyyyyy, 00vvvvvv ve 00zzzzzz olarak sıralanan 4 harflik bir yazı (sayı da olabilir) “xxxxxxyy yyyyvvvv vvzzzzzz” şeklinde şifrelenmiş veya sıkıştırılmış olur. Deşifre programı ise bunun tam tersi mantıkla çalışır. Programı inceleyerek ne gibi işlemler yapılmış anlayabilirsiniz. Bu programı kullanmak için dikkat edilmesi gerekenleri tekrar yazıyorum. Öncelikle yazılarınız 0 ile 64 (64 hariç) arasındaki ekran kodları olmalı, yani grafik karakterler, inverse harfler olursa işinize yaramaz. İkinci konu ise yazınız mutlaka 4 ve 4’ün katları uzunluğunda olmalıdır. Peki uzunluğa dikkat etmezsek ne olur? Mesela 20 değil de 22 harflik bir yazınız var. Şifreleme sırasında 22’den sonraki karakterlerin yerine hafızadan rastgele bir değer okunacak ve şifreleme yapılacaktır. Ama deşifre sırasında rastgele okunan baytlar deşifre sırasında yazıyla ilgisi olmayan birkaç harf şeklinde ekranda sırıtacaktır. Bunun çaresi ise yazınızın sonuna boşluk karakteri ekleyerek uzunluğu 4’ün katları haline getirmektir. Programın başlangıç adresi $0900 (2304)’te bir sıçrama tablosu vardır. Eğer BASIC’ten SYS 2304 yazarsanız şifreleme bölümünü, SYS 2307 yazarsanız deşifre bölümünü çalıştırabilirsiniz. Assembler bilenler için bir sorun olacağını zannetmem. Veya rutinleri ayırıp ayrı ayrı kullanabilirsiniz. Umarım işinize yarar.
Eğer bu program ile ilgili sorularınız olursa aşağıdaki e-mail adreslerine bir e-mail atın yeter.
hades6510@mynet.com ve hades6510@yahoo.com
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 26
asl asl4 asl asl asl asl rts ;--------------------------------------------------------------------; read .byte $bd,0,0 rts ;--------------------------------------------------------------------; length .byte 3 temp .byte 0 ;====================================================================; *=$0a00 text .scrl "c-64" ; şifrelenecek text burada olacak fuse .byte 32,32,32
;====================================================================; *=$0b00 ; deşifre edilen text buraya yazılacak desifrememory .byte 0 ;====================================================================; *=$0c00 ; şifrelenmiş text burada olacak sifrememory .byte 0 .end ;====================================================================; Bu sayının program köşesine hoş geldiniz. Bu programın hikayesi oldukça eskidir. Askerde teskere için gün sayarken, boş durmaktan sıkıldığım bir vakitte aklıma geldi ve kağıt üzerinde bitirdim. Daha sonra oturup kodladım ve diskete kaydettim. 1994’ten beri disketlerin birinde bekliyordu. Fakat bir zamanlar yapmaya başlayıp bıraktığım bir platform oyununda, ekran datalarını bu programlamla şıkıştırarak yer kazandım. Hatta yine başlayıp bıraktığım bir shoot-em-up oyununun HI-SCORE ekranında çıkacak isimleri bu programla şifreleyip daha sonra deşifre ederek ekrana yazdırıyordum. Aslında programın adı “TEXT PACKER-DEPACKER” idi. Fakat bazı sınırlamalardan dolayı “TEXT ŞİFRE-DEŞİFRE” adını koymayı uygun gördüm. Lafı fazla uzatmadan programın teknik açıklamasına ufaktan bir giriş yapalım. Bilindiği gibi C64’te bir karakteri ekrana iki şekilde çıkarabilirsiniz. Birincisi doğrudan ekran belleğine karakterin - EKRAN KODUNU - POKE komutuyla yerleştirerek, ikincisi ise PRINT komutuyla tırnak işaretleri arasında yazarak C64’te ekrana bir yazı yazabiliriz.. İkincisi standart ASCII kodları kullanır ve C64 ile kullanabileceğiniz kodlar 32 ($20) ile 96 ($60) kodları arasındaki karakterlerdir. Bizim için önemli olan EKRAN KODLARI’dır ve sadece C64 için tasarlanmıştır. Standart ASCII kodlarda $40 ile $60 (64 - 96) arasındaki karakterler EKRAN KODU’nda 0 ile $20 (0 – 32) arasındadır, $20 ile $40 arasındaki kodlar ise değişmemiştir. Biraz daha ayrıntıya inersek bizim programın kullandığı ekran kodları -bizim işimize yarayacak olan ilk 64 karakterdir (0 - $40 arası)- 6 bitten oluştuğu için şifreleme veya sıkıştırma işleminin mantığını anlatmaya başlayabiliriz.
Yazının başında bahsettiğim sınırlama, şifrelenecek yazının sadece ekran koduyla ve ekran kodlarının da sadece ilk 64 karakteriyle yazılmış olmasından kaynaklanmaktadır. İkinci bir sınırlama -aslında sınırlama değil mecburiyettir- şifrelenecek yazının 4 ve 4’ün katları uzunluğunda olmasının gerektiğidir. Vereceğimiz örneğin basit olması için hafızada ekran kodlarıyla bulunan “ABCD” yazısını sıkıştıracağız veya şifreleyeceğiz. Bu yazı hafızada aşağıdaki şekilde bulunmaktadır.
ADRES ( A HARFİ ) ADRES + 1 ( B HARFİ ) 0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 0
ADRES + 2 ( C HARFİ ) ADRES + 3 ( D HARFİ ) 0 0 0 0 0 0 1 1
0 0 0 0 0 1 0 0