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