C64 İÇİN BAŞA AŞAĞI KARAKTER SETİ PROGRAMI
Retro bilgisayarNEREDEN : İ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.