1x2 KARAKTER SETİ
Retro bilgisayar;=======================================================================================;
; 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

