İ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

