1x2 KARAKTER SETİ

;=======================================================================================; 
; C64 için yeni karakter seti #7    (1x2 FONT)  
     ; 
; C64 TÜRKİYE dergisi sayı 8 için hazırlanmıştır 
     ; 
; 01-06-2005 / ismail "hades" şahin  
     ; 
; hades@amigaturk.com 
www.c64turkiye.com  www.amigaturk.com  c64turkiye@amigaturk.com ; 
;=======================================================================================; 
Yazılım ile karakter setini değiştirmeye devam ediyoruz. 
*=$0801 
.word nextline 
.word 2005  
; 2005 
.byte $9e 
; SYS 
.text "2061" 
; 2061 
.byte 0 
; komutu 
nextline 
.word 0

start etiketli yere kadar olan kısımda LIST komutuyla göreceğiniz 2005 SYS2061 satırını oluşturuyoruz. start sei lda $01 and #$fb sta $01

Önce interrupları durduruyoruz ve karakter romunu erişilebilir hale getiriyoruz. 
lda 
#$d0 
ldx 
#$30 
ldy 
#$00 
sty 
$fb 
sta 
$fc 
sty 
$fd 
stx 
$fe
Karakter romunun ve Ram'e kopyalayacağımız yerin adreslerini tanımlıyoruz. 
ldx 
#$10 
transfer 
lda 
($fb),y 
sta 
($fd),y 
iny 
bne 
transfer 
inc 
$fc 
inc 
$fe 
dex 
bne 
transfer 
lda 
$01 
ora 
#$04 
sta 
$01 
cli
Yukarıdaki kısımda karakter romunu ram'e kopyalıyoruz.Daha sonra c64'ün bellek 
konfigürasyonunu eski haline getirip interruptları serbest bırakıyoruz. 
new_fonts 
lda 
#$30 
ldx 
#$34 
ldy 
#$00 
sty 
$fb 
sta 
$fc
C64 TÜRKİYE  #8                                                                                                                                              14 
sty 
$fd 
stx 
$fe 
lda 
#$80 
sta 
char_cnt 
Bu bölümde yine adres ayarlamaları yapılıyor ve karakter sayısı belirleniyor. 
loop2  
ldy 
#$00 
loop0  
lda 
($fb),y 
sta 
temp,y 
iny 
cpy 
#$08 
bne 
loop0
Y registerini bayt sayacı olarak kullanmak üzere sıfırlıyoruz ve Ramdaki karakter 
setimizdeki o anki karaktere ait 8 baytı okuyup geçici olarak saklıyoruz. 
ldx 
#$00 
ldy 
#$00 
loop1  
lda 
temp,x 
sta 
($fb),y 
iny 
sta 
($fb),y 
dey 
lda 
temp+4,x 
sta 
($fd),y 
iny 
sta 
($fd),y 
iny 
inx 
cpx 
#$04 
bne 
loop1

Normalde C64'ün karakter setinde bir karakterin hem normal hem de negatif şekilleri vardır. Daha önce karakter setimizi $3000-$4000 arasına taşımıştık. Normalde C64'te 2 adet karakter seti vardır ve setler arası geçiş "SHIFT-COMMODORE" tuşlarıyla yapılır. ROM'daki birinci set $D000-$D7FF, ikinci set $D800-$DFFF arasındadır. Buna göre RAM'da $3000-$37FF adresleri arasında 1. set, $3800-$3FFF arasında 2. set bulunacaktır. Bizim programımız 1. set ile işlem yapacaktır. $3000-$33FF arasında karakterlerin normal şekli, $3400-$37FF arasında ise negatif şekilleri vardır. Bir karakterin normal şeklinin ekran kodu 0-127 arasındadır, bu kodların 128 fazlası ise karakterin negatif şeklinin kodudur. Bizim programımız bir karakteri uzatırken hem normal, hem de negatif şekil bilgilerinin bulunduğu bölgede işlem yapmaktadır. Bu kısa bilgiden sonra işlemleri anlatalım. İlk olarak X ve Y registerlerini sıfırlıyoruz. Sonra ise daha önceden geçici olarak sakladığımız ilk baytı okuyup ilk karakter için $3000 ve $3001 adreslerine yazıyoruz. Daha sonra geçici olarak sakladığımız baytlardan 4. baytı alıp $3400 ve $3401 adreslerine yazıyoruz. Bu işlemleri 4 kez tekrarlayınca ilk karakterimizin boyunu uzatmış oluyoruz. Daha doğrusu 1x1'den 1x2'ye dönüştürmüş oluyoruz. lda $fb clc adc #$08 sta $fb sta $fd bcc no_hi inc $fc inc $fe no_hi dec char_cnt bne loop2

Bir sonraki karakterin boyunu uzatmak için gerekli hesaplamaları yapıyoruz. Karakter sayacını 1 azaltıyoruz ve sıfır oluncaya kadar yukarıdaki işlemleri tekrarlıyoruz.

lda 
#$01 
jsr 
$e536
Bütün işlemler bittikten sonra yazı rengi beyaz olacak şekilde ekranı siliyoruz. 
lda 
#$1c 
sta 
$d018
Yeni karakter setini aktif hale getiriyoruz. 
ldx 
#$00 
stx 
$d021 
loop3  
lda 
text,x 
sta 
$04a0,x 
clc 
adc 
#$80  
sta 
$04a0+$28,x 
inx 
cpx 
#$0e 
bne 
loop3 
rts
Son olarak ekran koduyla bir yazı yazıyoruz. İlk satıra yazdığımız bir karakteri 
$80 ile toplayıp bir alt satıra yazıyoruz.   
text  
.scrl "c64 turkiye #8"  
;deneme yazısı 
char_cnt 
.byte 0 
;karakter sayacı 
temp  
.byte 0 
;geçici saklama yeri 
.end