C64 İÇİN 90° SOLA YATIK KARAKTER SETİ PROGRAMI

KARAKTER SET NO: 4

(C64ASM V1.1 ile compile edilecek şekilde yazılmıştır.)

*=$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
init
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
loop3
ldy
#$00
; Y registeri byte sayacı=0
loop1
lda
($fb),y
; O anki adresin değerini oku
ldx
#$00
; X registeri "ror" işlem sayacı
loop0
clc
; carry bitini sıfırla
cfg0
ror
; aküdeki değeri 1 bit sağa döndür.
cfg1
rol
temp,x
; "c" bitini "rol" ile temp'e yaz
inx
; x registerini 1 arttır
cpx
#$08
; 8 oldumu?
bne
loop0
; olmadıysa tekrarla
iny
; byte sayacını 1 arttır
cpy
#$08
; 8 oldumu?
bne
loop1
; olmadıysa işlemleri tekrarla.
ldy
#$00
; sayacı sıfırla
loop2
lda
temp,y
; temp adresindeki byte’ları oku
sta
($fb),y
; o anki karakterin adreslerine yaz
iny
; sayacı 1 arttır.
cpy
#$08
; 8 oldumu?
bne
loop2
; olmadıysa işlemleri tekrarla
lda
$fb
; Karakter setinin LO adresini al
clc
; Carry bitini sıfırla
adc
#$08
; 8 ile topla
sta
$fb
; LO adrese yaz
bcc
next_char
; elde biti yoksa git
inc
$fc
; Karakter setinin HI adresini 1 arttır
next_char
lda
$fc
; HI adresi al
cmp
#$40
; #$40 oldumu? Olmadıysa
bne
loop3
; işlemleri tekrarla
rts
; Olduysa programı bitir.
temp
.byte 0,0,0,0,0,0,0,0
.end

Program listesinde cfg0 ve cfg1 etiketli satırlardaki komutların değiştirilmesiyle 4 farklı karakter seti elde edilebilir. Aşağıda bu komutları ve elde edilen karakter setlerini görebilirsiniz.

cfg0 ror cfg0 ror cfg1 rol temp,x cfg1 ror temp,x

cfg0 rol cfg0 rol cfg1 rol temp,x cfg1 ror temp,x