C64 İÇİN BAŞA AŞAĞI KARAKTER SETİ PROGRAMI

NEREDEN          : İSTANBUL 
NİCK / GRUP(LAR) : HADES / HI3S 
WEB SİTE         : WWW.HI3S.ORG 
HTTP://HADES6510.SITEMYNET.COM 
*=$0801 
.word nextline 
.word 2004  
; 2004 
.byte $9e 
; SYS 
.text "2061" 
; 2061 
.byte 0 
; komutu 
nextline 
.word 0 
sei 
;İnterruptları engelle 
lda 
$01 
;Karakter ROM'u 
and 
#$fb  
;artık CPU tarafından  
sta 
$01   
;okunabilir 
lda 
#$d0  
;ROM adresi = $D000 
ldx 
#$30  
;RAM adresi = $3000 
ldy 
#$00  
;olacak şekilde ayarla. 
sty 
$fb 
;$FB ve $FC adreslerinde 
sta 
$fc 
;ROM adresi tutuluyor. 
sty 
$fd 
;$FD ve $FE adreslerinde 
stx 
$fe 
;RAM adresi tutuluyor. 
ldx 
#$10  
;Blok sayacı = $10 (16) 
transfer 
lda 
($fb),y 
;ROM'dan o anki adresi 
sta 
($fd),y 
;oku ve RAM'e kopyala 
iny 
;byte sayacını 1 arttır 
bne 
transfer 
;"0" değilse geri dön 
inc 
$fc 
;ROM HIGH adresi 1 arttır 
inc 
$fe 
;RAM HIGH adresi 1 arttır 
dex 
;Blok sayacını 1 azalt 
bne 
transfer 
;"0" olmadıysa geri dön. 
lda 
$01 
;I/O bölgesi eski haline 
ora 
#$04  
;getiriliyor. CPU artık 
sta 
$01 
;karakter roma erişemez 
cli 
;interruptlara izin ver 
lda 
#$1c  
;VIC'e yeni karakter 
sta 
$d018  
;setinin yerini bildir. 
new_fonts 
lda 
#$30  
;Karakter seti başlangıç 
ldy 
#$00  
;adresi $3000 olarak 
sty 
$fb 
;$FB ve $FC adreslerine 
sta 
$fc 
;kaydediliyor 
loop2  
ldy 
#$00  
;Y registeri byte sayacı=0 
loop0  
lda 
($fb),y 
;O anki adresten bir byte oku 
pha 
;okunan değeri yığına at 
iny 
;sayacı 1 arttır 
cpy 
#$08  
;8 oldumu ? 
bne 
loop0  
;olmadıysa bir byte daha oku  
ldy 
#$00  
;Y registeri byte sayacı=0 
loop1  
pla 
;yığındaki değeri al 
sta 
($fb),y 
;O anki adrese yaz 
iny 
;sayacı 1 arttır 
cpy 
#$08  
;8 oldumu ? 
bne 
loop1  
;olmadıysa yeni değeri al.

Yukarıdaki komutlarla bir karakteri baş aşağı çeviriyoruz. Burada asıl can alıcı nokta "YIĞIN" dediğimiz bölgenin kullanılmasıdır Yığın "LIFO" -Last In First Out- mantığıyla çalışır. Yani yığına atılan en son sayı ilk önce geri alınır. Bizim komutlar ilk çalışmaya başladığında önce $3000'den itibaren ilk 8 byte'ı okuyup yığına atmaktadır. Böylece yığına en son $3007 adresindeki değer atılmış olmaktadır. Yığından geri alma işlemi sırasında ise ilk önce $3007 adresinin değeri alınmaktadır. Bu işlemi 8 defa tekrarladığımızda ise bir karakterin datalarını kendi içinde tersten yerleştirmiş oluyoruz. Aşağıdaki tablo daha açıklayıcı olacaktır.

$3000 --> yığın --> $3007 
$3001 --> yığın --> $3006 
$3002 --> yığın --> $3005 
$3003 --> yığın --> $3004 
$3004 --> yığın --> $3003 
$3005 --> yığın --> $3002 
$3006 --> yığın --> $3001 
$3007 --> yığın --> $3000 
lda 
$fb 
;Karakter setinin LO adresini al 
clc 
;Elde bitini sfırla 
adc 
#$08  
;8 ile topla 
sta 
$fb 
;LO adrese geri yaz. 
bcc 
next_char 
;Toplama sonucu "elde" biti "0" ise git 
inc 
$fc 
;Karakter setinin HI adresini 1 arttır 
next_char 
lda 
$fc 
;HI adresi al 
cmp 
#$40  
;#$40 oldumu? Olmadıysa bir sonraki 
bne 
loop2  
;karakter için işlemleri tekrarla 
rts 
;Olduysa programı bitir. 
.end 
Gördüğünüz gibi kısacık bir programla $3000-$4000 arasındaki karakter 
setimizi baş aşağı çevirmiş olduk. Programın listesini “program dökümleri” 
sayfasında bulabilirsiniz. Ekran görüntülerimiz ise aşağıdadır.

Normal karakter setli ekran görüntüsü Ters karakter setli ekran görüntüsü. Bir başka karakter setinde görüşmek dileğiyle.