İNTRO EFEKTLERİ 1x1 TEXT FADER ;=======================================================================================; ; 1x1 text fade intro efekt programı ; ; C64 TÜRKİYE dergisi sayı 8 için hazırlanmıştır ; ; 15-05-2005 / İsmail "hades" Şahin ; ; hades@amigaturk.com www.c64turkiye.com www.amigaturk.com c64turkiye@amigaturk.com ; ;=======================================================================================; *=$0801 prg .word nextline .word 2005 .byte $9e .text "2061" .byte 0 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 #<irq ldx #>irq ldy #$01 sta $0314 stx $0315 sty $d01a

İnterruptları engelledikten sonra, interrupt vektörlerini bizim rutinimizi gösterecek şekilde değiştiriyoruz ve satır tarama interruptı yapacağımızı VIC'e bildiriyoruz. lda color jsr $e536 stx $d015 stx $d01d dex stx $d020 stx $d021 stx $d027

Ekranı temizliyoruz ve geri dönüşte X registerinin değerini (X registerinde 1 değeri var) 1 numaralı sprite'ı açmak ($D015) ve X ekseninde genişletmek ($D01D) için kullanıyoruz. Sonra X registerini 1 azaltıp ekran renklerini ve 1 numaralı sprite'ın rengini siyah yapıyoruz. lda #$ff loop0 sta sdata,x inx bne loop0

Sprite şekil datası için kullanılacak hafıza bölgesini $FF ile dolduruyoruz. 
Böylece programda kullanacağımız sprite'ın şekli dikdörtgen oluyor. 
lda 
#(sdata/64) 
sta 
$07f8

Sprite şekil datasının bulunduğu bölgeyi sprite pointerine yazıyoruz.

C64 TÜRKİYE  #8                                                                                                                                              10 
ldx 
#$18 
ldy 
#$25 
stx 
$d000  
sty 
$d001
Sprite'ın X ve Y koordinatlarını belirliyoruz. 
lda 
#<text1 
ldx 
#>text1 
sta 
get_tx+1 
stx 
get_tx+2
Ekrana yazdıracağımız yazının başlangıç adresini programdaki ilgili yere 
kopyalıyoruz. 
ldx 
#$00 
loop1  
lda 
text1,x 
sta 
$0400+13,x 
inx 
cpx 
#$0e 
bne 
loop1
İlk yazımızı ekrana yazıyoruz. 
lda 
max_del 
sta 
delay_cnt
Sprite hareket gecikme sayacını ayarlıyoruz 
lda 
max_move 
sta 
move_cnt
Sprite hareket sayacını ayarlıyoruz. 
lda 
max_text 
sta 
text_cnt
Ekrana yazdırılacak maksimum text sayacını ayarlıyoruz. 
lda 
#$ee 
sta 
dir
Sprite'ın ilk hareket yönü için "INC" komut kodunu programdaki yerine yazıyoruz. 
cli 
jmp 
*
İnterruptları serbest bırakarak programı sonsuz döngüye sokuyoruz. 
irq 
inc 
$d019 
dec 
delay_cnt 
bne 
exit
Hareket gecikme sayacını bir azaltıyoruz. Sıfır olmadıysa programdan çıkıyoruz.  
lda 
max_del 
sta 
delay_cnt

Hareket gecikme sayacı sıfır olduysa, sayacı tekrar yüklüyoruz ve devam ediyoruz.

C64 TÜRKİYE  #8                                                                                                                                              11 
dec 
move_cnt 
bne 
dir 
lda 
max_move 
sta 
move_cnt 
lda 
dir 
eor 
#$20 
sta 
dir

Hareket sayacını bir azaltıyoruz ve sıfır olmadıysa "dir" yazan yere gidiyoruz. Sıfır ise hareket sayacını tekrar yüklüyoruz. “EOR” ile hareket yönünü değiştiriyoruz. cmp #$ee beq drx

Hareket yönünü kontrol ediyoruz. Eğer "INC" komutu ise (yani hareket soldan sağa 
ise) "drx" yazan yere gidiyoruz. 
lda 
get_tx+1 
clc 
adc 
#$0e 
sta 
get_tx+1 
bcc 
cont 
inc 
get_tx+2

Eğer "DEC" ise (yani sağdan sola ise) ekrana basılacak yeni yazının adresini hesaplayıp programdaki yerine yazıyoruz. Hesaplama sırasında elde biti "1" olduysa yazıların alınacağı adresin yüksek baytını 1 arttırıyoruz. Değilse aşağıda devam ediyoruz. cont dec text_cnt bne get_text lda max_text sta text_cnt lda #<text1 ldx #>text1 sta get_tx+1 stx get_tx+2

Ekranda gösterilecek yazı sayacını 1 azaltıyoruz. Sıfır olmadıysa "get_text" bölümüne gidiyoruz. Eğer sıfır olduysa Text sayacını ayarlıyoruz ve ilk yazının adresini programda ilgili yere yazıyoruz. get_text ldx #$00 get_tx lda text1,x sta $040d,x inx cpx #$0e bne get_tx

Bu kısımda ekrana yazı yazıyoruz. 
drx 
lda 
col+1 
eor 
color 
sta 
col+1
Yukarıdaki komutlarla renk belleği için kullanacağımız değeri siyah/sarı şeklinde 
değiştiriyoruz. 
dir 
inc 
$d000 
lda 
$d000 
sec 
sbc 
#$10 
lsr 
lsr 
lsr
C64 TÜRKİYE  #8                                                                                                                                              12 
tax 
col 
lda 
#$00 
sta 
$d800,x

Bu son kısımda ise sprite'ın X koordinat değerini değiştiriyoruz. Sonra bu değerden $10 (16) sayısını çıkarıyoruz. 3 kez sağa kaydırıp rengini değiştireceğimiz bellek pozisyonu için sütun değerini elde ediyoruz. Bu değeri X registerine kopyalıyoruz. En son olarak LDA komutunun parametresindeki değeri o anki renk belleği pozisyonuna yazıyoruz. exit jmp $febc

Son komutla ise kernaldaki işletim sistemi rutinine geri dönüyoruz. 
move_cnt 
.byte 0 
;O anki hareket sayacı 
delay_cnt 
.byte 0 
;O anki hareket gecikme sayacı 
text_cnt 
.byte 0 
;O anki text sayacı 
color  
.byte 7 
;Default renk (sarı) 
max_text 
.byte 10 
;Ekranda gösterilecek maksimum text sayısı 
max_del 
.byte $80 
;Default gecikme değeri 
max_move 
.byte $e0 
;Default hareket miktarı 
text1  
.scrl "--------------" 
.scrl "c64 turkiye #8" 
.scrl "introlar  icin" 
.scrl "sade bir efekt" 
.scrl "1x1 text fader" 
.scrl "code:hades/asc" 
.scrl "  10-05-2005  " 
.scrl "11111111111111" 
.scrl "22222222222222" 
.scrl "33333333333333" 
sdata  
=$09c0 
;Sprite datasının bulunduğu bölge 
.end
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