PROGRAM KÖŞESİ
;====================================================================;
;
TEXT ŞİFRE / DEŞİFRE PROGRAMI
;
;
31-05-2003 / HADES
;
;====================================================================;
*=$0900
;--------------------------------------------------------------------;
mainsifre
jmp sifre
maindesifre
jmp desifre
;--------------------------------------------------------------------;
sifre
lda #<text
ldx #>text
sta read+1
stx read+2
lda #<sifrememory
ldx #>sifrememory
sta $fb
stx $fc
ldx #$00
ldy #$00
looppack
jsr read
asl
asl
sta temp
inx
jsr read
jsr lsr4
ora temp
sta ($fb),y
jsr read
jsr asl4
sta temp
inx
jsr read
lsr
lsr
ora temp
iny
sta ($fb),y
jsr read
jsr asl6
sta temp
inx
jsr read
ora temp
iny
sta ($fb),y
inx
iny
cpy length
bne looppack
rts
;--------------------------------------------------------------------;
desifre
lda #<sifrememory
ldx #>sifrememory
sta read+1
stx read+2
lda #<desifrememory
ldx #>desifrememory
sta $fb
stx $fc
ldx #$00
ldy #$00
loopdepack
jsr read
lsr
lsr
sta ($fb),y
jsr read
and #$03
jsr asl4
sta temp
inx
jsr read
jsr lsr4
ora temp
iny
sta ($fb),y
jsr read
and #$0f
asl
asl
sta temp
inx
jsr read
jsr lsr6
ora temp
iny
sta ($fb),y
jsr read
and #$3f
iny
sta ($fb),y
iny
inx
cpx length
bne loopdepack
rts
;--------------------------------------------------------------------;
lsr6
lsr
lsr
lsr4
lsr
lsr
lsr
lsr
rts
;--------------------------------------------------------------------;
asl6
asl
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
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